国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

第9/24周 理解執行計劃

2024-07-21 02:46:55
字體:
來源:轉載
供稿:網友
第9/24周 理解執行計劃

歡迎回到性能調優培訓。今天標志著第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'

在那個查詢里,你告訴數據庫:

  1. 你想要從表A和表B獲取數據
  2. 2個表需要通過ID列進行連接
  3. 表A里的行需要在X列上進行過濾

你通過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里執行計劃緩存的更多細節,還有執行計劃緩存為什么是重要又危險的概念。請繼續關注!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梁平县| 萝北县| 五原县| 包头市| 辉县市| 濮阳县| 临沧市| 新绛县| 嘉定区| 陆河县| 茂名市| 罗江县| 从江县| 株洲市| 广元市| 广东省| 宜章县| 商河县| 常德市| 安溪县| 专栏| 西平县| 太原市| 吴忠市| 达州市| 九江县| 广宁县| 广汉市| 华蓥市| 重庆市| 湟源县| 大姚县| 新兴县| 阳朔县| 南阳市| 怀柔区| 获嘉县| 益阳市| 北碚区| 南丰县| 古交市|