第一章(1) 當查詢提交時會發生什麼事情

2021-09-06 21:40:49 字數 4095 閱讀 7708

原文:

第一章(1)——當查詢提交時會發生什麼事情

執行計畫,簡單而言,就是sqlserver查詢優化器嘗試通過計算最有效的方法來實現你提交的t-sql查詢請求的結果。

執行計畫可以告訴你sqlserver將會如何執行乙個查詢或者它是如何執行乙個查詢。因此,它們是處理低效能查詢的主要手段。你可以通過執行計畫去定位引起問題的sql**,而不是通過猜測為什麼乙個給定的查詢會引起數以千計的掃瞄,使得你的i/o飛漲。舉個例子,你的查詢可能過去需要讀取整個表的資料,但是通過移除where子句中的函式,可以直接查詢你所需要的那些行。執行計畫就是告訴你這些甚至更多。

這章的目標是教你獲取圖形化、文字化或者xml格式的實際與預估執行計畫,並理解如何檢視這些計畫的基礎知識。為了達到這個目的,我們將覆蓋以下主題:

l  查詢優化器的簡單背景介紹——執行計畫是優化器操作的結果,所以了解至少一點點關於優化器是什麼並如何執行的是非常有用的。

l  實際和預估執行計畫——它們是什麼並且有什麼區別。

l  獲取和解釋各種格式的執行計畫之間的不同——包括圖形化、文字化和xml執行計畫。

l  直接從cache中獲取執行計畫——通過dynamicmanagement objects(dmos)訪問計畫快取。

l  自動化執行計畫獲取——使用sqlserver跟蹤事件。

當你提交乙個查詢到sqlserver時,在伺服器上會伴隨有一系列針對這個查詢的處理操作。這些處理的目的是為了管理系統以便能select,insert,update或者delete對應的資料。

1.  發生在關係引擎中的處理。

2.  發生在儲存引起中的處理。

在關係引擎中,查詢被解析然後由查詢優化器處理,最終產生執行計畫。產生的執行計畫以二進位制格式發給儲存引擎,儲存引擎以這個計畫作為基礎查詢或者修改底層資料。儲存引擎是處理譬如鎖定、索引維護和事務等操作的地方。我們將主要關注從關係引擎中產生的執行計畫。

當我們提交乙個t-sql查詢到sqlserver系統時,它進入的第乙個地方是關係引擎(乙個t-sql可以是來自於命令列或者從儲存過程中發起的資料請求的ad hoc,即席查詢。)。當t-sql到達之後,將傳遞給乙個處理操作,以檢查t-sql是否寫的正確,也就是是否有正確的格式。這個處理操作就是查詢解析(query parsing)。如果乙個查詢在解析過程中失敗,比如,你輸入了seletc(t和c的順序錯了)而不是select ,那麼解析操作將停止,然後sqlserver返回乙個錯誤到查詢源。解析處理的結果就是生成乙個解析樹,或者叫查詢樹甚至叫順序樹。查詢樹顯示了執行該查詢所必須的邏輯步驟。

如果t-sql字串不是dml語句而是ddl語句,將不會被優化,舉個例子,對於sqlserver系統來說,有且僅有乙個「正確的方式」去建立乙個表。因此,對於這類語句,沒有改進效能的機會。

如果t-sql是dml語句且已經通過解析,那麼解析樹會被傳輸到乙個名為algebrizer的處理部件中。algebrizer標識單獨列上正在訪問的物件的資料型別。它同時也決定查詢中的聚合運算的位置,這部分的處理叫做聚合繫結(aggregate binding)。algebrizer非常重要,因為查詢中可能存在別名或者同義詞,甚至在資料庫中不存在的名字,這些必須經過處理,否則查詢將引用不存在於資料庫中的物件。當物件不存在於這個資料庫時,sqlserver會從這步中返回乙個錯誤,表明物件名無效。比如,algebrizer可以快速地在adventureworks2008r2中找到person.person表。但是當對於product.person表,因為不存在,所以會引起乙個錯誤,並且使得整個優化過程停止。

algebrizer 輸出乙個二進位制資料稱為查詢處理樹,並傳輸給查詢優化器。查詢處理樹包含了乙個hash(描述查詢的乙個已經編碼的值)。優化器使用這個hash去確認是否已經生成了乙個計畫並儲存在計畫快取中。當發現已經有計畫存在,優化過程將在這裡結束並使用這個計畫。這樣可以降低優化器生成乙個新計畫的整體開銷。

優化器本質是一塊模型,用於模擬資料庫關係引擎如何工作的軟體。其中被優化器使用的資料中最重要的部分是統計資訊,是由sqlserver針對索引和列產生並維護的,明確用於優化的部分。通過查詢處理樹和關於資料的統計資訊,優化器應用模型以便算出它認為是執行查詢的最佳方式,也就是說,它產生乙個執行計畫。

換句話說,優化器指出了如何最好地實現你所提交的查詢請求的方式。它決定如果可以通過索引訪問資料,會使用什麼型別的關聯比較合適。這個決定是通過優化器針對給定的執行計畫,計算出它的開銷情況,包括需要的cpu處理和i/o。因此,它是乙個基於成本的計畫。

優化器會產生並評估很多計畫,除非已經快取了計畫,通常來說,會選擇開銷最低的計畫,也就是它認為可以盡快且使用更少資源地執行查詢的計畫。對於執行開銷的計算是其中最重要的計算,優化器會使用乙個高cpu開銷的處理過程來計算是否能更快地返回結果。有時候,如果優化器覺得評估很多計畫的時間比執行乙個次優計畫更長,那麼優化器會勉強同意使用乙個次優執行計畫。優化器並不是去找最好的執行計畫,而是找到最少可能的迭代次數的最低開銷的計畫,也就是說找到在處理過程中最短時間的計畫。

如果提交已給非常簡單的查詢,例如乙個沒有聚合運算或計算的單錶查詢,相對於花費時間去計算絕對的最優執行計畫,優化器會選擇使用乙個無關緊要的執行計畫來應對這種型別的查詢。比如,下面列出的例子將建立乙個無關緊要的執行計畫。

use adventureworks2008r2

goselect d.name

from humanresources.department as d

where d.departmentid=42

當加上乙個以上的表,且用join關聯時,會使得計畫不再無關緊要。如果查詢並不是無關緊要,優化器將使用基於開銷的計算來選擇乙個計畫。為了實現這種計算,會依賴於sqlserver所維護的統計資訊。

統計資訊是收集自在資料庫內列和索引的,用於描述資料的分布、唯一性或者選擇性。我們並不希望優化器在每次對查詢生成執行計畫時,讀取所有涉及表的所有資料,所以優化器會依賴於統計資訊,統計資訊是提供用於優化器描述整個資料集合中的數學結構上的取樣資料。優化器對統計資訊的信賴度意味著這些資訊必須盡可能地準確否則優化器可能選擇次優甚至不正確的執行計畫。

組成統計資訊的資料以直方圖的形式展現,是乙個針對特定值的出現次數的乙個統計**,這些資料來自於表中平均取樣的200個值。這些資料被稱為描述資料的資料,為優化器計算提供必要的資訊。

如果統計資訊在相關的列或者索引上存在,那麼優化器可以用它們來作為計算依據。優化器會檢查統計資訊,以便決定索引是否提供了足夠程度的選擇性用於協助當前查詢。選擇性是指貫穿在整個資料集中的唯一資料的程度。要求的索引的選擇性級別是非常高的,通常在例項上以x%來表示。

統計資訊預設情況下會在所有索引或者出現在謂詞中(where子句的部分或者join on子句部分)的列上自動建立和維護。表變數永遠不會建立有統計資訊,所以優化器總假定它們只包含一行,而不在乎他們的實際大小。

臨時表會產生與永久表同型別的統計資訊,並且供優化器使用。

優化器通過把這些統計資訊及查詢處理樹,啟發式地決定最優執行計畫。意味著這個工作將通過一系列的計畫,測試不同的訪問資料的方法,嘗試不同型別的join,重排join的順序,嘗試不同的索引等等,直到找到它認為開銷最低的執行計畫為止。在這系列計算過程中,優化器會對計畫內每個步驟賦予乙個數值,表示預估的cpu數量和磁碟io時間的組合值。這個值就是這個步驟的預估開銷。這些值的總和就是執行計畫本身的預估開銷總和。

需要重點留意的是預估開銷僅僅是預估,給定乙個無窮大的時間,實時更新的統計資訊,優化器可以找到執行查詢的最優計畫,但是,在時間允許的情況下它會嘗試計算最優執行計畫,並受可用統計資訊的品質限制。因此,這個預估值在衡量的時候非常有用,但是並不能精確地反映實際情況。

一旦優化器獲得乙個執行計畫,就會把預估計畫建立出來並存放在乙個叫做plan cache的記憶體塊中。在前面提到過,如果優化器發現乙個計畫和快取中的計畫相匹配,這個處理過程將短路。

一旦優化器產生了乙個執行計畫,或者在快取中找到,這個操作將切換到儲存引擎,儲存引擎是根據執行計畫執行查詢的地方。

在這裡我們不打算深入說明,但是要注意產生的執行計畫可能在執行執行過程中改變,比如:

l  sqlserver 發現執行計畫超過了使用並行執行的閾值,詳細內容將在第三章中說明。

l  用於產生執行計畫的統計資訊過時,或者在原始執行計畫建立後發生改變。

l  在查詢中的過程或物件,如資料插入了乙個臨時表,引起了執行計畫的重編譯。

上面所述的任何乙個方面都會引起預估執行計畫的變更。

sqlserver在關係引起更改格式一邊匹配提交的t-sql語句請求後,返回查詢的結果。

第一章(1) 當查詢提交時會發生什麼事情

執行計畫,簡單而言,就是sqlserver查詢優化器嘗試通過計算最有效的方法來實現你提交的t sql查詢請求的結果。執行計畫可以告訴你sqlserver將會如何執行乙個查詢或者它是如何執行乙個查詢。因此,它們是處理低效能查詢的主要手段。你可以通過執行計畫去定位引起問題的sql 而不是通過猜測為什麼乙...

第一章1 解釋

補全 如下 sum int a,unsigned len main printf lf sum a,0 sum int a,unsigned len 此處main函式中定義了陣列a,擁有3個元素。除錯時第12行sum累加運算處設定斷點 visual studio 中快捷鍵為f9 然後除錯執行 vis...

第一章 什麼是TCP IP

要回答什麼是協議,首先要回答什麼是網路。網路是計算機之間通過常用的傳輸介質 絕緣的金屬導線 線 無線網路 不需要線路 進行通訊的集合。網路協議就是一套通用規則,用來幫助定義複雜資料傳輸的過程。tcp ip 協議定義了網路通訊的過程,定義了資料單元的格式和內容,以便接收計算機能夠正確解釋接收到的訊息。...