ms访问查询非常慢

时间:2015-06-15 16:24:32

标签: sql ms-access join

我有这个ms访问查询:

SELECT t1.sb, suchbegriff2, menge
FROM (SELECT artnr & '/' & [lfdnr-kal] AS sb, left(suchbegriff,7) &
         val(right(suchbegriff,4)) AS suchbegriff2 
      FROM kvks 
      WHERE suchbegriff like '*/*')  AS t1 
INNER JOIN (SELECT artnr & '/' & [lfdnr-kal] AS sb, 
                 [artnr-hz] & '/' & val(lfdnr) AS hz, menge 
            FROM konf 
            WHERE [artnr-hz]<>'')  AS t2 
      ON (t1.sb=t2.sb) AND (t1.suchbegriff2=t2.hz);

它运行得非常慢(超过30秒)。我想通了,这是因为inner join部分。如果我离开这个,速度是正确的。

也许是因为事实缓慢,连接字段是计算表达式?

修改

我根据Smandoli的答案修改了查询:

SELECT kvks.artnr & '/' & kvks.[lfdnr-kal] AS sb, 
    left(suchbegriff,7) & val(right(suchbegriff,4)) AS suchbegriff2, 
    konf.menge
FROM kvks, konf
WHERE kvks.suchbegriff like '*/*' 
    and konf.[artnr-hz]<>'' 
    and kvks.artnr=konf.artnr 
    and kvks.[lfdnr-kal]=konf.[lfdnr-kal] 
    and left(suchbegriff,7) & val(right(suchbegriff,4))=[artnr-hz] & '/' & val(lfdnr) 

现在运行正确。

感谢您的贡献。

4 个答案:

答案 0 :(得分:3)

这些计算字段确实很复杂。为何不直接加入?下面的查询会留下一个'/'未列入的内容,但应该告诉您我在想什么。

SELECT 
   t1.sb, 
   left(st1.uchbegriff,7) & val(right(t1.suchbegriff,4)) AS suchbegriff2, 
   t1.menge 

FROM kvks AS t1     
INNER JOIN konf AS t2 

WHERE (t1.suchbegriff like '*/*')
    AND (t2.artnr-hz<>'')
    AND (t1.artnr=t2.artnr) 
    AND (t1.lfdnr-kal=t2.lfdnr-kal) 
    AND (left(t1.suchbegriff,7)=t1.[artnr-hz]) 
    AND (val(right(t1.suchbegriff,4))=val(t2.hz)); 

答案 1 :(得分:1)

对于内部联接,您可以尝试使用已保存的查询(或临时表),而不是在运行时编写查询。

所以,我首先尝试抽象这个查询

SELECT artnr & '/' & [lfdnr-kal] AS sb, 
                 [artnr-hz] & '/' & val(lfdnr) AS hz, menge 
            FROM konf 
            WHERE [artnr-
            hz]<>'')  AS t2 
      ON (t1.sb=t2.sb) AND (t1.suchbegriff2=t2.hz)

其次,如果可能的话,我会抽象查询中的一些函数。您可以使用VBA执行此操作,或者在查询之外操作数据。

第三,您总是可以在桌面上创建一个字段,将您需要的两个字段组合在一起。

E.x:在konf表格中新建一个存储artnr & '/' & [lfdnr-kal]

值的列

您需要做的是限制运行时字段的功能/计算/合并。查询要做的事情很多,如果它运行缓慢,我会看到它之间的方向相关性,或者与索引/连接不一致的东西。

如果您已将此识别为连接问题,则可以使用VBA根据查询启动临时表,并将其用作记录源而不是SQL。 此外,如果您不使用临时表,至少保存查询。这允许Access有一个运行查询的计划,而您的查询是100%依赖于运行时。

答案 2 :(得分:0)

由于&#34;嵌套&#34;您的查询运行缓慢然后&#34;加入&#34;。您可以尝试创建临时表并在查询中使用该表。创建临时表是一种很好的做法,而不是使查询变得复杂。

答案 3 :(得分:-1)

99999 !!!我想你只需要实现一些索引

 (t1.sb=t2.sb) AND (t1.suchbegriff2=t2.hz);

这些非常可疑。是4索引?