优化Microsoft Access嵌套查询

时间:2010-08-31 23:50:33

标签: sql ms-access

我正在尝试在Microsoft Access中运行一组嵌套或堆叠查询。

As in I run Query 1
-->I use the results of Query 1 in Query 2
---->I use the results of Query 2 in Query 3
------>I use the results of Query 3 in Query 4

查询3运行时间不到1秒。

-- Query 3 results -- 
PARTID  INFO
266 156-10
266 165-10
266 183-10
266 200-10
266 205-10
266 219-10
266 228-10
266 230-10
--end Query 3 results --

当我运行查询4时,运行需要一分多钟。很慢。所以我尝试使用查询3的结果创建一个新表(Test_Table)。我修改了查询4以使用此表而不是查询3.现在,查询4在不到1秒的时间内运行。

原始慢速查询4代码:

SELECT INVENTORYLOG.TABLEID, INVENTORYLOG.RECORDID, TIINVENTORYLOG.INFO, INVENTORYLOG.TYPEID
FROM Query3 INNER JOIN (TIINVENTORYLOG INNER JOIN INVENTORYLOG ON TIINVENTORYLOG.INVENTORYLOGID = INVENTORYLOG.ID) ON (Query3.PARTID = INVENTORYLOG.PARTID) AND (Query3.INFO = TIINVENTORYLOG.INFO)
WHERE (((INVENTORYLOG.TYPEID)<>40))
ORDER BY TIINVENTORYLOG.INFO;

修改快速查询4代码:

SELECT INVENTORYLOG.TABLEID, INVENTORYLOG.RECORDID, TIINVENTORYLOG.INFO, INVENTORYLOG.TYPEID
FROM Test_Table INNER JOIN (TIINVENTORYLOG INNER JOIN INVENTORYLOG ON TIINVENTORYLOG.INVENTORYLOGID = INVENTORYLOG.ID) ON (Test_Table.info = TIINVENTORYLOG.INFO) AND (Test_Table.partid = INVENTORYLOG.PARTID)
WHERE (((INVENTORYLOG.TYPEID)<>40))
ORDER BY TIINVENTORYLOG.INFO;

Inventorylog有大约23,000条记录 tiinventorylog有大约18,000条记录

所以我想问题是:如何使用Query 3而不是我的测试表快速运行Query 4?

感谢您提供任何建议。

2 个答案:

答案 0 :(得分:0)

在不知道前两个查询的情况下,很难立即看到问题所在。但是,我会说当你有一个表连接到另外两个表时,事情总是会变慢。 (加入一个长链比加入一个圆圈更快,这就是你在这里所拥有的。)正如你所看到的,你有query3加入你的两个表。也许这样的事可能会更好。但它实际上取决于索引,表的大小以及其他两个查询的内容 - 如果两个库存表很大,这实际上可能会减慢它。

所以,一旦你提供了更多信息,我可能会修改这个想法。

SELECT *
from (select INVENTORYLOG.TABLEID, 
            INVENTORYLOG.RECORDID, 
            TIINVENTORYLOG.INFO,
            INVENTORYLOG.TYPEID,
            INVENTORYLOG.PARTID
          from INVENTORYLOG 
          inner join TIINVENTORYLOG 
            on TIINVENTORYLOG.INVENTORYLOGID = INVENTORYLOG.ID
          where INVENTORYLOG.TYPEID<>40)a     
inner join query3 
    on query3.partid = a.partid
    and query3.info = a.info

答案 1 :(得分:0)

您已经采用了复杂的查询,将其分解为不同的部分,并创建了可以在以后重复使用的单独查询。所有这些都很好,除非你的表现受到打击。我已经注意到SQL Server中的这个问题,当视图嵌套3深或更多时。你很少得到任何东西。

现在您已经知道了对查询的期望,并且可以轻松地对它们进行测试,请尝试将前两个结合起来。您可能必须在SQL文本编辑器中执行此操作。如果幸运的话,可以从Query1复制SQL并将其放在查询2中

Select * from Query1;

变为

Select * from (Select whatever you pasted from Query1) as Query1;

我知道这可能变得复杂且难以维护,但如果你想提高性能,你通常不得不放弃。