【问题标题】:How to speed up a simple SQL query in Access如何加快 Access 中的简单 SQL 查询
【发布时间】:2015-12-09 00:44:31
【问题描述】:
SELECT status_master.*
FROM 100_orders_open 
INNER JOIN status_master 
ON [100_orders_open].OEHISORD_DOC_NO = status_master.OESTATUS_DOC_NO;

status_master 是一个包含 110 万行的本地表。

100_orders_open 是一个查询,它过滤包含 107,441 行到 301 行的本地表 order_master

在 8GB 内存机器上查询需要 47 秒。 我无法改进硬件。

有没有办法提高查询性能?

【问题讨论】:

    标签: sql performance ms-access inner-join


    【解决方案1】:

    这里有一些策略:

    1. 明确选择所需的字段,而不是笼统的*。返回更少的列可能会提高性能。
    2. 100_orders_open查询变成临时表,重温ACE引擎优化器的另一个查询过程。使用生成表查询 (SELECT * INTO newtable FROM query)。和索引临时表。
    3. 索引表中的任何唯一字段,尤其是在JOIN 语句中(即OESTATUS_DOC_NO 和查询的源表字段OEHISORD_DOC_NO)。
    4. 将大表拆分为另一个 MS Access 文件并将其链接到本地​​数据库以避免接近 2 GB 限制并释放缓存空间。或者,如果可用,升级到服务器级数据库(即 SQL Server、Oracle、MySQL)。另外,像 SQLite 这样的 MS Access 是一个文件级数据库。

    【讨论】:

      【解决方案2】:

      您需要构建另一个视图(查询)并将其组合到上述查询中。正如其他人所说,其他查询中使用的列已编入索引,当然 OESTATUS_DOC_NO 也已编入索引。

      由于您声明其他查询仅返回 300 行,因此如果可以在此处使用索引,则此查询可能会立即执行。

      因此,您必须像以前一样将查询放在查询上(或视图上查看),并尝试将查询作为一个整体编写——而不是两个单独的查询。

      【讨论】:

        【解决方案3】:

        对于这个查询:

        SELECT status_master.*
        FROM 100_orders_open INNER JOIN
             status_master 
             ON [100_orders_open].OEHISORD_DOC_NO = status_master.OESTATUS_DOC_NO;
        

        您想要在status_master(OESTATUS_DOC_NO) 上建立索引。这应该会显着提升性能。

        【讨论】:

          【解决方案4】:

          我不确定 Access 是否有很多查询优化器,但我认为:

          SELECT status_master.*
          FROM status_master 
          JOIN 100_orders_open 
          ON status_master.OESTATUS_DOC_NO = [100_orders_open].OEHISORD_DOC_NO 
          

          SELECT * from status_master WHERE status_master.OESTATUS_DOC_NO IN (SELECT [100_orders_open].OEHISORD_DOC_NO  from 100_orders_open) 
          

          会更快。

          不知道你在哪里,但让我补充一下,下面其他人提到的索引非常重要。我有点假设你已经知道了,但不应该。此外,我对 Access 一点也不熟悉,但 100_orders_open 视图实际上每次打开时都会运行一个查询。这个视图的 SQL 是什么?将该 SQL 中的必要内容合并到此查询中可能也会快得多。

          【讨论】:

          • 您刚刚在主查询中添加了一个子查询。我会在这个测试中等待 OP,但通常建议使用 JOIN 而不是 IN。是的,Jet/ACE 引擎确实有一个query optimizer
          • 取决于查询引擎。我做了很多 Oracle 工作,在 Oracle 中,第二个查询通常是最快的形式。
          • @MikeFeltman 确实!我忘了包括对 RDMS 的依赖。当然,它也取决于底层表结构和索引。因此,我等待OP。但平均而言,JOIN 有助于提高可读性和特定记录检索(即,想象添加另一个 WHERE 条件)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-20
          • 1970-01-01
          • 1970-01-01
          • 2011-01-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多