我正在尝试在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?
感谢您提供任何建议。
答案 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;
我知道这可能变得复杂且难以维护,但如果你想提高性能,你通常不得不放弃。