WEB开发网
开发学院数据库MSSQL Server 理解SQL Server的SQL查询计划 阅读

理解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操作来支持散列与合并连接。

上一页  3 4 5 6 7 8 

Tags:理解 SQL Server

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接