gpt4 book ai didi

sql-server - 由于内连接和左连接导致 SQL 查询速度慢?

转载 作者:行者123 更新时间:2023-12-02 22:45:30 24 4
gpt4 key购买 nike

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

如果执行此查询:

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)和一个表位于不同的数据库目录中,其中一个处于内连接,另一个处于左连接,就会出现性能问题。

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

最佳答案

一般经验法则是,OUTER JOIN 会导致结果集中的行数增加,而 INNER JOIN 会导致结果集中的行数减少。/em> 当然,在很多情况下情况恰恰相反,但这种方式更有可能起作用。为了提高性能,您想要做的就是尽可能长时间地保持结果集(工作集)的大小尽可能小。

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

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

因为优化器应该重写一些东西,这可能不足以完全解释您所看到的行为,所以您仍然需要检查每个操作所使用的执行计划查询,并可能按照之前的建议添加索引。不过,这仍然是一个值得学习的好原则。

关于sql-server - 由于内连接和左连接导致 SQL 查询速度慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com