开发者社区> 问答> 正文

由于内部联接和左联接,SQL查询速度慢?

谁能解释这种行为或如何解决?

如果执行此查询:

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

这将非常非常非常缓慢。

如果将查询更改为使用两个内部联接而不是左侧联接,则查询速度将非常快。如果将其更改为使用两个左联接而不是内部联接,它将非常快。

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

每当您有一个表变量(或freetexttable)和一个不同数据库目录中的表时,就会出现性能问题,其中一个在内部联接中,另一个在左联接中。

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

展开
收起
心有灵_夕 2019-12-26 22:13:58 770 0
1 条回答
写回答
取消 提交回答
  • 一般的经验法则是,OUTER JOIN导致结果集中的行数增加,而INNER JOINs导致结果集中的行数减少。 当然,在很多情况下,情况也相反,但是以这种方式工作的可能性更大。您想要做的就是保持结果集(工作集)的大小尽可能小。

    由于两个联接在第一个表上都匹配,因此更改顺序不会影响结果的准确性。因此,您可能想在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]
    
    

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

    因为优化器应该重新编写代码,所以这可能不足以完全解释您所看到的行为,因此您仍然需要检查用于每个查询的执行计划,并可能按照前面的建议添加索引。但是,这仍然是学习的好原则。

    2019-12-26 22:14:25
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载