我正在尝试在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;修改后的Fast Query 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?
谢谢你能给我的任何建议。
发布于 2010-09-01 10:06:45
如果不知道前两个查询,就很难立即看到问题所在。然而,我要说的是,当你有一个表连接到另外两个表时,事情总是会变慢。(加入一个长链比加入一个圆圈更快,这就是你在这里所做的。)正如您所看到的,您已经将query3连接到两个表。也许这样的方法可能会更好地工作。但这实际上取决于索引、表的大小以及其他两个查询-如果两个inventory表很大,这实际上可能会减慢它的速度。
所以,一旦你提供了更多的信息,我可能会修改这个想法。
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发布于 2010-09-01 20:58:02
您已经获取了一个复杂的查询,将其分解为不同的部分,并创建了单独的查询,这些查询可以在以后重用。所有这些都是好的,除了你的性能受到了影响。在SQL Server中,当视图嵌套3层或更深时,我就注意到了这个问题。你很少不劳而获。
现在,您知道了从查询中期望得到什么,并且可以轻松地对它们进行测试,现在尝试组合前两者。您可能需要在SQL文本编辑器中执行此操作。如果幸运的话,可以从Query1复制SQL并将其放入查询2中。
Select * from Query1;变成了
Select * from (Select whatever you pasted from Query1) as Query1;我知道这可能会变得复杂,更难维护,但如果你想提高性能,你通常必须放弃一些东西。
https://stackoverflow.com/questions/3614039
复制相似问题