理解SQL Server的SQL查询计划
2007-05-15 09:27:10 来源:WEB开发网核心提示: Recursive Hash(递归散列) :有时Grace Hash产生的分区扇出表仍然太大以至需要更进一步的再分区,这个就叫做递归散列,理解SQL Server的SQL查询计划(8),注意到,散列与合并连接将每个表都处理一次,你可以很清晰的看到每一个连接将其他连接的谓词作为剩余谓词,(你
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操作来支持散列与合并连接。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
赞助商链接