当前位置:  开发笔记 > 数据库 > 正文

内部和左侧连接导致SQL查询速度慢?

如何解决《内部和左侧连接导致SQL查询速度慢?》经验,为你挑选了1个好方法。

任何人都可以解释这种行为或如何绕过它?

如果您执行此查询:

select * 
from TblA
left join freetexttable ( TblB, *, 'query' ) on TblA.ID = [Key]
inner join DifferentDbCatalog.dbo.TblC on TblA.ID = TblC.TblAID

这将非常非常缓慢.

如果您将该查询更改为使用两个内部联接而不是左联接,则会非常快.如果将其更改为使用两个左连接而不是内连接,则会非常快.

如果使用sql表变量而不是freetexttable,则可以观察到相同的行为.

每当有一个表变量(或自由文本表)和一个不同数据库目录中的表时,就会出现性能问题,其中一个表位于内连接中,另一个表位于左连接中.

有谁知道为什么这么慢,或者如何加快速度?



1> Joel Coehoor..:

一般的经验法则是OUTER JOIN会导致结果集中的行数增加,而INNER JOIN会导致结果集中的行数减少. 当然,有很多情况下相反的情况也是如此,但它更有可能以这种方式工作而不是.您要为性能做的是尽可能地保持结果集(工作集)的大小尽可能小.

由于两个连接在第一个表上匹配,因此更改顺序不会影响结果的准确性.因此,您可能希望在LEFT JOIN之前执行INNER JOIN:

SELECT * 
FROM TblA
INNER JOIN DifferentDbCatalog.dbo.TblC on TblA.ID = TblC.TblAID
LEFT JOIN freetexttable ( TblB, *, 'query' ) on TblA.ID = [Key]

实际上,无论您为连接指定了哪个顺序,查询优化器都应该足够智能,可以编译以使用更快的选项.但是,最好假装您有一个愚蠢的查询优化器,并且查询操作按顺序进行.这有助于未来的维护者发现有关表格性质的潜在错误或假设.

因为优化器应该重写东西,这可能不足以完全解释你所看到的行为,所以你仍然想要检查用于每个查询的执行计划,并且可能添加一个索引,如前面所建议的.不过,这仍然是一个很好的学习原则.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有