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 & '/' & [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这个事物代码在做操作的时候,多人操作同一个事务代码时很慢很慢,是啥原因?