查詢處理和執行 查詢計畫

2021-06-20 08:41:10 字數 2507 閱讀 2622

檢視查詢計畫的方式有如下幾種:

1、上下文相關的選單選項

6、 使用dmf

select * from sys.dm_exec_query_plan(plan_handle)

select * from sys.dm_exec_text_query_plan(plan_handle)

查詢計畫操作符查詢優化器可以使用多種不同的操作符來建立計畫。這裡將展示幾個最常用的操作符。

join操作符

join操作符使sql server能夠在兩個表之間找到匹配的行。sql server有3種join型別,它們處理來自兩張表的行,對於自聯接,輸入可能是同一張表的不同行集。nested loop有利於內部表有索引的小表;merge join有利於有排序索引或輸出需要排序的中等表;hash join有利於中大型的表,對於並行計畫表現不錯,縮放好。

nested loop join會掃瞄一張表(外部表)的所有行,然後掃瞄另一張表(內部表)的每一行,如果行在內外表匹配,則該行就被包含在結果中。這種join的效能與每張表的行數成正比。通常行數少的表被選作內部表,行數多的用作外部表,如果兩種表都有大量的行,那麼join就會花費很長時間。

merge join需要對輸入分類,因此理想狀況下,表應該對join列索引,然後操作符會同時迭代兩種表的行,減少行,尋找匹配行。由於輸入被排序,這使join能夠迅速進行,一旦任何乙個範圍滿足了就會停止。

hash join操作分兩個階段。在第一階段,被稱為構建階段(build phase),兩種表中更小的那張表被掃瞄,並把行存到記憶體裡的雜湊表,但對於非常大的表,它可以寫入磁碟。當每一行都被雜湊了,第二階段就開始了。第二階段,被稱為探索階段(probe phase),兩張表中更大的那張表的行被拿來和雜湊表的內容比較,使用和構建階段一樣的雜湊演算法。任何匹配的行被傳到輸出。has join能夠處理非常大的表,在允許並行計畫的多處理器系統上是個不錯的選擇。sql profiler事件在發生雜湊遞迴(hash recursion)或雜湊釋放(hash bailout)時會發出雜湊警告。雜湊遞迴發生在雜湊操作的輸出不能完全裝進記憶體。雜湊釋放發生在雜湊遞迴到達遞迴的最大水平,並且必須選擇乙個新計畫。雜湊警告是效能問題的潛在指標,其可能的解決方案是增加記憶體、確保join列上存在統計並且是最新的、強制使用不同型別的join。

spool 操作符

spool操作符用於建立來自輸入流的行的臨時副本,並把它們傳送到輸出流。spool通常位於兩個其他操作符之間,右邊的是child,提供輸入流;左邊的操作符是parent,消耗輸出流。下面列表為每個物理spool操作符提供簡要的描述,這些是實際執行的操作符。你也可以參見邏輯操作符,其代表優化操作的更早階段,在執行計畫之前,這些操作符隨後被轉換為物理操作符。邏輯spool操作符是eager spool和lazy spool。

scan和seek操作符

這兩個操作符使sql server能夠在需要較大量的行的時候,從表及索引中檢索行。scan操作符掃瞄表中所有行來尋找匹配的行。當匹配的行數超過表的20%,scan就開始勝過seek,因為seek有穿越索引到達每一行的額外成本。scan操作符變體有聚集索引掃瞄、非聚集索引掃瞄和表掃瞄。seek操作符使用索引找到匹配的行。當查詢僅需要相對小的行集時,seek比scan更快找到匹配的行;然而,當返回的行數超過表的20%時,seek的成本就會接近scan;當幾乎需要整張表時,scan會比seek執行得快。seek操作符變體有聚集索引seek和非聚集索引seek。

lookup操作符

lookup操作符執行尋找單行資料的任務。常見的有:

閱讀查詢計畫

各種形式的查詢計畫要從右下方開始閱讀,到左上方。如下圖所示,我們首先應該看的index scan,然後是hash match、compute scalar、sort,最後是select。

查詢處理和執行 查詢優化(1)

查詢優化器的工作就是接收查詢樹並找到乙個獲取資料 結果 的好方式。查詢優化處理基於成本原則,這個成本是抽象的測量值,用於評估不同的查詢計畫選項。sql server團隊提供的當前模式工作如下 上面所訴步驟的輸出結果是能夠放入快取的可執行的計畫。這個計畫之後被安排執行。你可以通過sys.dm exec...

PLSQL查詢執行計畫

一般優化途徑 如果能通過修改語句優化,比如查詢條件或執行順序,sql改不了,可以通過增加索引來解決,增加索引還不行,那就要考慮實現方式是否有問題了 一段sql 寫好以後,可以通過檢視sql的執行計畫,初步 該sql在執行時的效能好壞,尤其是在發現某個sql語句的效率較差時,我們可以通過檢視執行計畫,...

mysql 查詢執行計畫 MySql執行計畫的檢視

一。什麼是資料庫執行計畫 利用乙個sql語句,你可能要server取出所有news表中的資訊.當server收到的這條sql的時候,第一件事情並不是解析它.如果這條sql沒有語法錯誤,server才會繼續工作.server會決定最好的計算方式.server會選擇,是讀整個news表好呢,還是利用索引...