在sql server 2008中引入的圍繞執行計畫和緩衝的新功能被稱為查詢計畫hash和查詢hash。這是使用針對查詢或查詢計畫的演算法來生成二進位制hash值的二進位制物件。
可以從sys.dm_exec_query_stats或sys.dm_exec_requests檢索查詢計畫hash和查詢hash。雖然這是確認查詢及其計畫的一種機制,但是hash值不是唯一的。不相似的查詢可能得出相同的hash,所以不能將其作為備份主鍵。
分別建立兩個查詢如下:
select兩個查詢僅僅是from和where大小寫不通以及第乙個引數不同,設計成inner join和兩個條件稍微複雜點是為了防止簡單引數化生成引數計畫,再執行以下查詢:*from personhunderthousand inner
join
province
on personhunderthousand.pid =
province.id
where personhunderthousand.name =
'郎徊刺
'and province.name ='廣東
'select
*frompersonhunderthousand inner
join
province
on personhunderthousand.pid =
province.id
wherepersonhunderthousand.name =
'習笑'
and province.name ='廣東
'
select t.text該查詢生成了乙個新的計畫。,s.execution_count,s.query_hash,s.query_plan_hash
from
sys.dm_exec_query_stats s
看到輸出如下:
從上面的輸入圖可以看到,建立了兩個不同的計畫,因為這些查詢不是引數化的,它們太複雜以致不能考慮簡單引數化,並且強制引數化關閉。這兩個計畫有相同的hash值,因為它們不同的方面只是傳遞的值。大小寫的差別對查詢hash或查詢計畫hash來說無關緊要。
但是如果修改select改為只返回一列:
select personhunderthousand.id from personhunderthousand inner
join
province
on personhunderthousand.pid =
province.id
where personhunderthousand.name =
'郎徊刺
'and
province.name ='
廣東'
儘管查詢的基本結構相同,返回列中的修改也足以改變查詢hash和查詢計畫hash值。
因為資料分布和索引中的不同可能導致相同的查詢得出兩個不同的計畫,query_hash可能相同,_query_plan_hash可能不同
另外,有時就算只傳入乙個引數,但是因為根據統計,不同的引數的執行計畫不同,也會建立兩個計畫:
select查詢計畫hash和查詢hash值對於跟蹤完全不同的查詢之間的常見問題可能是有用的工具,但是正如所見,它們不能再每種可能性中得到一組精確的資訊。它們增加了又一種確認查詢效能可能低下的場所的有用工具。可以在將查詢部署到生產環境仲之後捕捉查詢的query_plan_hash,然後隨時觀察以了解其是否因資料變化而變化。由此,可以引用sys.dm_exec_query_stats根據計畫跟蹤集合的查詢狀態,但是要記住,這些集合的資料在伺服器重啟時會重置。*from
persontenthousand
where id =1/
100--假若傳入的引數會生成不同的執行計畫,那麼也會建立不同的計畫
查詢計畫Hash和查詢Hash
原文 查詢計畫hash和查詢hash 在sql server 2008中引入的圍繞執行計畫和緩衝的新功能被稱為查詢計畫hash和查詢hash。這是使用針對查詢或查詢計畫的演算法來生成二進位制hash值的二進位制物件。可以從sys.dm exec query stats或sys.dm exec req...
查詢計畫Hash和查詢Hash
原文 查詢計畫hash和查詢hash 在sql server 2008中引入的圍繞執行計畫和緩衝的新功能被稱為查詢計畫hash和查詢hash。這是使用針對查詢或查詢計畫的演算法來生成二進位制hash值的二進位制物件。可以從sys.dm exec query stats或sys.dm exec req...
查詢之HASH查詢
前面的查詢是一系列關鍵字比較,查詢速度相對較慢。hash查詢的優勢來了 a.哈系函式 乙個把查詢表中的關鍵字對映成該關鍵字對應的位址的函式,adde hash key 這裡的位址可以是下標,索引,或記憶體位址。b.雜湊表 由根據關鍵字而直接進行訪問的資料結構。雜湊表建立了關鍵字和儲存位址之間的一種直...