首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化Microsoft Access嵌套查询

优化Microsoft Access嵌套查询
EN

Stack Overflow用户
提问于 2010-09-01 07:50:33
回答 2查看 4K关注 0票数 0

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

代码语言:javascript
复制
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秒。

代码语言:javascript
复制
-- 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代码:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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?

谢谢你能给我的任何建议。

EN

回答 2

Stack Overflow用户

发布于 2010-09-01 10:06:45

如果不知道前两个查询,就很难立即看到问题所在。然而,我要说的是,当你有一个表连接到另外两个表时,事情总是会变慢。(加入一个长链比加入一个圆圈更快,这就是你在这里所做的。)正如您所看到的,您已经将query3连接到两个表。也许这样的方法可能会更好地工作。但这实际上取决于索引、表的大小以及其他两个查询-如果两个inventory表很大,这实际上可能会减慢它的速度。

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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2010-09-01 20:58:02

您已经获取了一个复杂的查询,将其分解为不同的部分,并创建了单独的查询,这些查询可以在以后重用。所有这些都是好的,除了你的性能受到了影响。在SQL Server中,当视图嵌套3层或更深时,我就注意到了这个问题。你很少不劳而获。

现在,您知道了从查询中期望得到什么,并且可以轻松地对它们进行测试,现在尝试组合前两者。您可能需要在SQL文本编辑器中执行此操作。如果幸运的话,可以从Query1复制SQL并将其放入查询2中。

代码语言:javascript
复制
Select * from Query1;

变成了

代码语言:javascript
复制
Select * from (Select whatever you pasted from Query1) as Query1;

我知道这可能会变得复杂,更难维护,但如果你想提高性能,你通常必须放弃一些东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3614039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档