【发布时间】:2009-12-05 15:15:30
【问题描述】:
好的,我意识到这是一个非常模糊的问题,但请耐心等待。
我在很多场合都遇到过这个问题,有不同的和不相关的查询。下面的查询需要很长时间才能执行:
SELECT <Fields>
FROM <Multiple Tables Joined>
LEFT JOIN (SELECT <Fields> FROM <Multiple Tables Joined> ) ON <Condition>
但是,只需添加连接提示,它就可以在几秒钟内执行查询:
SELECT <Fields>
FROM <Multiple Tables Joined>
LEFT HASH JOIN (SELECT <Fields> FROM <Multiple Tables Joined> ) ON <Condition>
奇怪的是,提示中指定的 JOIN 类型并不能真正提高性能。似乎是因为提示导致优化器孤立地执行子查询然后加入。如果我为子查询创建一个表值函数(不是内联函数),我会看到相同的性能改进。例如
SELECT <Fields>
FROM <Multiple Tables Joined>
LEFT JOIN dbo.MySubQueryFunction() ON <Condition>
有人知道为什么优化器在这种情况下如此愚蠢吗?
【问题讨论】:
-
您使用的是什么版本的 SQL Server?
-
我在 2005 年和 2008 年都遇到过这个问题
标签: sql sql-server