为什么一个SQL连接选择一个次优的查询计划?

好了,所以我知道这是一个非常模糊的问题,但多多包涵。

我曾多次与不同的和不相关的查询遇到这个问题。 下面的查询需要多少分钟来执行:

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>

任何人有任何想法,为什么优化器在这种情况下如此愚蠢?

--------------解决方案-------------

如果任何这些表是表变量,优化器使用的0行的不良估计,并通常选择嵌套循环的联接技术。

它这样做是由于缺乏对所涉及的表统计。

优化器是一种算法。 这不是愚蠢或聪明的,它的工作原理是编程的方式。

Hash join意味着建立一个哈希表在一个较小的row source,这就是为什么内部查询必须先执行。

在第一种情况下优化程序可能选择了nested loop 。 它推动了连接条件进入内查询和执行在每个迭代内部查询与一个额外的谓词。 它可能无法找到这个谓词适当的索引和full table scan确实发生在每次迭代。

这很难说,为什么出现这种情况,除非您发布准确的查询,有多少行是在表中。

随着表函数是不可能的推连接条件为内部查询,这就是为什么它被执行一次。

里面的SQL Server 2005:T-SQL查询回答这些和许多其他问题。 其中一个T-SQL数据检索和动词加工的引擎盖下是我见过的最好的样子。 (不,我不是这本书的作者,我也不是附属于任何作者或书,或微软或微软出版社的作者。这简直是一个令人难以置信的工作,以及各种数据库管理员,我转身到这个过去几年同意。)

分类:SQL 时间:2015-03-15 人气:0
本文关键词: SQL,SQL服务器
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.308 (s). 10 q(s)