2010-12-08 101 views
0

我遇到了严重的麻烦,我有一个巨大的细微查询需要很长时间来执行。其实它冻结访问,有时我要杀死它的查询看起来像:在Access中选择优化

SELECT 
    ITEM.*, 
    ERA.*, 
    ORDR.*, 
ITEM.COnTY1, 
(SELECT TOP 1 New FROM MAPPING WHERE Old = ITEM.COnTY1) AS NewConTy1, 
ITEM.COnValue1, 
(SELECT TOP 1 KBETR FROM GEN_KUMV WHERE KNUMV = ERA.DOCCOND AND KSCHL = (SELECT TOP 1  New FROM MAPPING WHERE Old = ITEM.COnTY1)) AS NewCOnValue1 
--... etc: this continues until ConTy40 

FROM 
GEN_ITEMS AS ITEM, 
GEN_ORDERS AS ORDR, 
GEN_ERASALES AS ERA 

WHERE 
ORDR.ORDER_NUM = ITEM.ORDER_NUM AND -- link between ITEM and ORDR 
ERA.concat = ITEM.concat -- link between ERA and ITEM 

我不会为你提供的表的模式,因为查询的作品,想什么,我知道的是,如果有一种方法使用另一种技术添加NewConTy1和NewConValue1以使其更有效。问题在于Con *字段从1到40,所以我必须将它们对齐(ConTy1旁边的NewConT1与New ConValue2旁边的NewConValue1直到40)。 ConTy#和ConTyValue#在ITEMS(每场) NewConty#和NewConValue#在ERA(每一个记录

我真的希望我的解释是不够找出我的问题, 期待着你们

听见

编辑:

忽略在选择TOP 1,这是因为数据的当前转储我是不准确的它会在稍后删除

编辑2:

另一件事我查询返回多达230场也笑

感谢 Miloud

+0

问题是数据结构不好。解决这个问题(以及所需的解决方法)就会消失。 – 2010-12-08 20:39:52

+0

@ David-W-Fenton也许你没有机会阅读评论? – Fionnuala 2010-12-08 22:44:14

+0

有什么意见?我没有看到任何解决SQL中出现的非常糟糕的结构问题的东西。 – 2010-12-10 03:52:19

回答

3

你有没有考虑联合查询正常化的项目?

SELECT "ConTy1" As CTName, Conty1 As CTVal, 
     "ConTyValue1" As CTVName, ConTyValue1" As CTVVal 
     FROM ITEMS 
UNION ALL 
SELECT "ConTy2" As CTName, Conty2 As CTVal, 
     "ConTyValue2" As CTVName, ConTyValue2" As CTVVal 
     FROM ITEMS 
<...> 
UNION ALL 
SELECT "ConTy40" As CTName, Conty40 As CTVal, 
     "ConTyValue40" As CTVName, ConTyValue40" As CTVVal 
     FROM ITEMS 

这可以是一个单独的查询,链接到您的主查询或主查询的子查询,如果更方便。然后,应该很容易就可以得出与ERA中的NewConty#和NewConValue#的关系。

0

Remou的答案给出了你想要的 - 显着不同的方法。它已经有一段时间,因为我已经与MS Access查询优化插手,并已忘记了它的规划师的细节,但你可能想尝试一个简单的建议,实际上使你的

WHERE conditions 

INNER JOIN ON conditions 

你正在发射40个相关的子查询,所以上面可能不会有帮助(Remou的答案采取了显着不同的方法,你可能会看到真正的改进),但是让我们知道,因为它是微不足道的测试。

您可以采取的另一种方法是实现昂贵的部分,并采取Remou的想法,但将其分为不同的部分,您可以直接加入。

例如,您的第一个子查询与ITEM.COnTY1相关,您的第二个子查询与ERA.DOCCONDITEM.ConTY1相关。

如果根据相关的键对子查询进行分类,那么可以将它们保存为查询(或将它们实现为make table查询)并将它们加入到它们(或新创建的表)中,这些应该可能执行得更快make表格将以执行速度快得多,代价是实现 - 因此您必须在获取最新数据之前运行一些查询 - 这可以封装在宏或VBA函数/子文件中)。否则(例如,如果您定期运行上述查询作为日常业务用例的一部分) - 重新设计您的数据库。