频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

理解SQL Server的SQL查询计划

来源:铸锐论坛 作者:佚名 出处:巧巧读书 2007-04-04 进入讨论组
上一页 1 2 3 

理解连接的影响

上文的不同查询步骤展示了SQL Server 2000是如何运用大量的操作来解析Join(连接)的。每一个Join策略都有它的长处和短处。

然而,在某些罕见的情况下,查询引擎会选择效率较低的策略,如通常使用的Hash(散列)或Merge(合并)策略,而采用简单的嵌套循环就足以提供很好的性能。

SQL Server 使用三种join(连接)策略,这里由简单到复杂分别列出:

嵌套循环

对于使用简单内连接的小数据量表,嵌套循环是最佳策略。最适合两个表的记录数差别非常大,并且在连接的列上都有索引的情况。嵌套循环连接所需的I/O和比较都是最少的。

嵌套循环在外表(往往是小数据量的表)中每次循环一个记录,然后在内表中查找所匹配的记录并输出。有很多关于嵌套循环策略的名字。例如,对整个表或索引进行查询,称为Naive(无知的)嵌套循环连接。使用正常索引或临时索引时,被称为索引嵌套循环连接或临时索引嵌套循环连接。

合并

对于使用了排序连接列的大数据量并数据量相似的表,合并是最佳的策略。合并操作首先进行排序,然后对所有数据进行循环并产生输出。良好的合并连接性能基于在相应的列上建立索引,通常在连接谓词等式中用到的列。

合并连接发挥了预先排序的优点,从每个输出中获得行数据,直接进行比较操作。例如,例如,内连接返回的是连接谓词相等的记录。如果不相等,含更低值的记录将会被丢弃,并且用下一条记录进行比较。这个过程将持续直到所有的记录都被检查完。有时合并连接被用来比较具有多对多关系的表。当这种情况发生时,SQL Server用临时表来存储这些行。

如果在使用合并连接的查询中同时存在一个WHERE子句,那么这个合并连接谓词将首先被计算。然后经过合并连接谓词的每条记录将经过WHERE语句中的其他谓词再次计算。Microsoft 称之为residual predicate(剩余谓词)。

Hash(散列)

对于数据量大,容量不同的表,以及连接列没有排序或索引的复杂连接需求,Hash是最佳策略。散列法被用于UNION, INTERSECT, INNER, LEFT, RIGHT和OUTER JOIN,以及集合匹配和差别等操作。Hash也用于没有有用索引的连接表。Hash操作将建立临时的Hash表并且循环所有的数据并产生输出。

Hash使用一个build(已建造)输入(通常是小数据量的表)和probe(探测)输入。这个散列键(也就是在连接谓词中的列,或在GROUP BY列表中的列)被查询用来处理连接。剩余谓词是在WHERE子句中没有用于连接本身的所有其他运算。剩余谓词是在连接谓词之后计算。当构造一个Hash连接时,SQL Server可按下面的优先次序选择不同的选项:

In-memory Hash(内存中散列):In-memory hash连接首先将整个build输入扫描到内存中,然后在内存中创建一个临时hash表。计算出Hash值,然后将每条记录插入到Hash中。然后逐条扫描探测输入。每条探测输入将与对应的Hash相比较,如果匹配,将放在结果集中返回。

Hybrid Hash(混合散列):如果散列仅比可用的内存稍大,SQL Server可能合并in-memory hash连接和grace hash连接的某些方面,称之为hybrid hash 连接。

Grace Hash(优美散列):当hash join太大而不能在内存中处理时,就要用到Grace hash选项。在那种情况下,整个build输入和probe输入都将被读入。然后它们被分解成多个临时的工作表,该步骤称为分区扇出。Hash键值上的Hash函数确保了所有的连接记录都在同一对分区工作表中。分区扇出将两个耗时的步骤分解为很多小步骤,这些小步骤可以被并发处理。然后Hash连接将应用于每对工作表,将所有匹配放在结果集中返回。

Recursive Hash(递归散列) 有时Grace Hash产生的分区扇出表仍然太大以至需要更进一步的再分区,这个就叫做递归散列。

注意到,散列与合并连接将每个表都处理一次。如果使用SET STATISTICS IO ON来测量这种类型的查询,会看到较低I/O的假象。然而,较低的I/O并不意味着这些连接策略一定比嵌套循环连接要快,因为还需要巨大的计算量。

注意,散列连接的计算量很大。如果你发现在生产中某些查询始终用散列连接,这里要提示你应该调优你的查询或者在底层表中添加索引。

在下面的例子中,我们展示标准的嵌套循环(使用默认的查询计划)和散列与合并连接(强制使用提示)。

SELECT a.au_fname, a.au_lname, t.title

FROM authors AS a

INNER JOIN titleauthor ta

ON a.au_id=ta.au_id

INNER JOIN titles t

ON t.title_id=ta.title_id

ORDER BY au_lname ASC, au_fname ASC

StmtText

-------------------------------------------------------------------------------------

|--Nested

Loop(Inner Join, OUTER REFERENCES:([ta],[title_id]))

|--Nested Loops(Inner Join, OUTER REFERENCES:([a],[au_id]) )

| |--IndexScan(OBJECT:([pubs].[dbo].[authors].[aunmind] AS [a],ORDERED FORWAD))

| |--Index Seek(OBJECT:([pubs].[dbo].[titleauthor].[auidind] AS [ta],

SEEK: ([ta].[au_id]=[a].[au_id]) ORDERED FORWAD)

|--Clustered Index Seek (OBJECT:([pubs].[dbo].[titleas].[UPKCL_titleidind] AS [t],

SEEK: ([t].[title_id]=[ta].[title_id]) ORDERED FORWAD)

上面展示计划显示的是通过SQL Server产生的标准查询计划。我们可以强制SQL Server利用提示给我们展示它是怎样处理合并和散列连接的。

Select a.au_fname, a.au_lname, t.title

From authors AS a

INNER MERGE JOIN titleauthor ta

ON a.au_id=ta.au_id

INNER HASH JOIN titles t

ON t.title_id=ta.title_id

ORDER BY au_lname ASC, au_fname ASC

Warning:The join order has been enforced because a local join hint is used.

StmtText

-----------------------------------------------------------------------------------

|--Sort(ORDER BY:([a].[au_lname] ASC ,[a].[au_fname] ASC)

|--Hash Match(Inner Join,HASH:([ta].[title_id])=([t].[title_id]),

RESIDUAL:([ta].[title_id]=[t].[title_id]))

|--Merge Join(Inner Join, MERGE:([a] [au_id]=[ta].[au_id]),

RESIDUAL:([ta].[au_id]=[a].[au_id]))

| |--Clustered index Scan(OBJECT:([pubs].[dbo].[authors].[UPKCL_auidind] AS [a],

ORDERED FORWAD)

| |--Index Scan OBJECT:([pubs].[dbo].[titleauthor].[auidind] AS [ta], ORDERED FORWAD)

|--Index Scan (OBJECT:([pubs].[dbo].[titles].[titleind] AS [t]))

在这个例子中,你可以很清晰的看到每一个连接将其他连接的谓词作为剩余谓词。(你也会注意到提示的使用使SQL Server发出一个警告)。这个查询还强制使用SORT操作来支持散列与合并连接。

静态页面:http://www.qqread.com/sqlserver/2007/04/k306960.html 更多文章 更多内容请看SQL Server 数据处理专题SQL Server 索引和查询专题SQL Server专题,或进入讨论组讨论。
上一页 1 2 3 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章