歡迎回到性能調優培訓。今天標志著第3個月的培訓開始了,這個月我們全部學習SQL Server里的執行計劃。執行計劃在SQL Server里是你需要理解的,最重要的概念,對它做出有效的調整,就可以提高查詢性能。因此今天我會大致介紹下SQL Server里的執行計劃,還有你如何讀懂它們。
為什么會有執行計劃很多人經常問我在SQL Server里為什么需要執行計劃。我們已經有了SQL Server的查詢,但為什么SQL Server還需要執行計劃呢?為什么SQL Server不自己執行查詢呢?為了回答那個問題,我們需要進一步討論下SQL語言。SQL語言(在SQL Server也叫做T-SQL)是一個解釋性的語言(declarative language) 。你用一種邏輯的方式介紹從你數據庫想要的數據(SELECT查詢),或者在你數據里你想要修改的數據(INSERT, UPDATE, DELETE查詢)。就看下下面的查詢。
1 SELECT A.*, B.* FROM A2 INNER JOIN B ON A.ID = B.ID3 WHERE A.X = 'SomeValue'
在那個查詢里,你告訴數據庫:
你通過SQL語句來描述數據庫的查詢結果是什么樣的。用SQL語句你只指出結果,沒其他任何信息。你沒有告訴SQL Server如何執行這個查詢,即獲取數據的流程。
你總是和SQL Server以邏輯的方式打交道,描述下你想要獲取的數據,或者你想要修改的數據。但是SQL Server本身是需要一個實際執行計劃來描述如何獲取或修改數據的步驟。這個執行計劃就是被稱為查詢優化器(Query Optimizer)拿來處理你SQL查詢的策略。
這是我們現實生活的華麗重現:想下你要從一個城市到另一個城市旅游。例如你想從倫敦到巴黎旅游,你就定義了一個邏輯描述。當然,那個邏輯描述可以有多個實現方式:
選擇哪個并不重要,其實這里有很多不同的組合方式。你的旅行方式就會非常多。你肯定會選擇成本關聯最低的方式:坐飛機直達。在SQL Server里的查詢優化器也做著同樣的工作:查詢優化器會選擇滿足你查詢最省力的執行計劃。對于查詢優化器的挑戰就是:從查找空間(Search Space)里,找到足夠好(good enough)的執行計劃!查找空間就是在你查詢里涉及到的大量表和索引。
如何閱讀執行計劃第一次接觸到執行計劃時,你會碰到很多困難:你不能正確理解和讀懂它們。來看下下面的執行計劃:
從上圖可以看到,每個執行計劃包含很多步,在SQL Server里被稱為運算符(Operator) 。這些運算符被SQL Server逐個調用。這就是說在執行計劃里,運算符的執行流是從右到左的(從上到下)。
這里的SQL Server執行的第一步是:在Address表上的索引查找(非聚集索引)(Index Seek(Non Clustered))運算符。從掃描回來的每條記錄進入嵌套循環(Nested Loop)運算符。對于獲取的每條記錄,SQL Server在Address表進行了鍵查找(聚集索引)(Key Lookup (Clustered))運算符(一種書簽查找)。如果有匹配的行,這行就會傳給SELECT運算符,即把最終結果返回給程序。
從上面的描述,我們可以看到,剛開始閱讀執行計劃時,從右往左更容易,因為在執行計劃里,數據也是這樣流的。執行計劃實際上也是從右往左執行的。當我們從右到左跟著數據時,我們是在一種邏輯的方式閱讀執行計劃。
希望這種方式可以更好的幫你理解如何讀懂執行計劃。如果你想看看在SQL Server里,執行計劃支持哪些運算符,我推薦Fabiano Amorim的免費電子書《Complete Showplan Operators (PDF)》。
小結這期的性能調優培訓,我們弄清楚了SQL Server為什么需要執行計劃,還有如何讀懂執行計劃。如你所看到的,我們和SQL Server是以邏輯的方式打交道:我們通過SQL查詢描述數據庫里我們想要的數據,或者我們想要修改的數據。
查詢優化器的工作就是對這些查詢生成足夠好的執行計劃。執行計劃最終描述SQL Server實際執行步驟,來滿足并執行我們的查詢。下周我們會聚焦SQL Server里執行計劃緩存的更多細節,還有執行計劃緩存為什么是重要又危險的概念。請繼續關注!
新聞熱點
疑難解答