如何在Access中加速简单的SQL查询

时间:2015-09-12 15:44:52

标签: sql performance ms-access inner-join

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行的本地表 order_master 过滤为301行。

在8gb ram机器上查询需要47秒。 我无法改进硬件。

有没有办法提高查询效果?

4 个答案:

答案 0 :(得分:1)

以下是一些策略:

  1. 明确选择所需的字段而不是通用*。返回较少的列可能会提高性能。
  2. 100_orders_open查询转换为临时表以重新启动ACE引擎优化程序的另一个查询过程。使用make-table查询(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是文件级数据库。

答案 1 :(得分:1)

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

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

所以你必须放弃对查询的查询(或在视图上查看),并尝试将查询作为一个整体来编写 - 而不是两个单独的查询。

答案 2 :(得分:0)

我不确定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中必要的内容整合到此查询中可能也会快得多。

答案 3 :(得分:0)

对于此查询:

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)上的索引。这应该会显着提升绩效。