ms访问查询很慢

Posted

技术标签:

【中文标题】ms访问查询很慢【英文标题】:ms access query very slow 【发布时间】:2015-06-15 16:24:31 【问题描述】:

我有这个 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) 

现在运行正确。

感谢您的贡献。

【问题讨论】:

【参考方案1】:

这些计算字段确实很复杂。为什么不直接加入呢?下面的这个查询留下了一个'/' 下落不明,但应该告诉你我在想什么。

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)); 

【讨论】:

【参考方案2】:

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

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

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 &amp; '/' &amp; [lfdnr-kal] 的值

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

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

【讨论】:

保存的查询只提高了可读性,而不是性能。通常在动态的编程竞赛中,它们会降低性能,因为使用内置的临时查询,您可以在子查询的每个级别放置过滤器。第二把数据库生来就是为了连接表。这是他们的工作。问题是连接字段必须被索引。时间的减少是基于 2 的对数。这意味着如果一个查询需要 30000 次执行,如果您索引连接字段,您将达到 Log2(30000)=14 次... ein augenblink。 我会同意你的观点,但也会不同意。 MS Access 保存已保存查询的执行计划。只要您在数据更改时刷新执行计划,就应该对未保存的查询进行优化。您还可以压缩/修复数据库以重新计算执行计划【参考方案3】:

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

【讨论】:

如果您指的是 SQL Server 中的临时表,我相信在 MS Access 中您必须使用真实表。要使它们工作,您必须运行连续的例程,通常使用 VBA;你不能像你习惯的那样在堆栈中启动一组过程。 是的,您可以从原始表创建临时表,但您需要运行 VBA 来刷新该数据。 accessexperts.com/blog/2011/07/20/… 中解释了更多信息【参考方案4】:

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

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

这些很可疑。 4 有索引吗?

【讨论】:

以上是关于ms访问查询很慢的主要内容,如果未能解决你的问题,请参考以下文章

win10电脑打开此电脑资源管理器任务管理器软件等突然很慢很慢,cup内存磁盘利用率却很低

SAP migo这个事物代码在做操作的时候,多人操作同一个事务代码时很慢很慢,是啥原因?

jsp做的网页,用tomcat测试时读数据库数据时很慢很慢,是啥原因?

公司网络很慢很卡的原因分析与处理

MS Access UPDATE 查询很慢

数据结构