天天看點

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

http://www.cnblogs.com/knowledgesea/p/5005163.html

序言

本篇主要目的有二:

1、看懂t-sql的執行計劃,明白執行計劃中的一些常識。

2、能夠分析執行計劃,找到優化sql性能的思路或方案。

如果你對sql查詢優化的了解或常識不是很深入,那麼推薦幾篇博文給你:SqlServer性能檢測和優化工具使用詳細 ,sql語句的優化分析,T-sql語句查詢執行順序。

執行計劃簡介

1、什麼是執行計劃?

大哥送出的sql語句,資料庫查詢優化器,經過分析生成多個資料庫可以識别的高效執行查詢方式。然後優化器會在衆多執行計劃中找出一個資源使用最少,而不是最快的執行方案,給你展示出來,可以是xml格式,文本格式,也可以是圖形化的執行方案。

2、預估執行計劃,實際執行計劃

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

選擇語句,點選上面其中一個執行計劃,預估執行計劃可以立即顯示,而實際執行計劃則需要執行sql語句後出現。預估執行計劃不等于實際執行計劃,但是絕大多數情況下實際的執行計劃跟預估執行計劃都是一緻的。統計資訊變更或者執行計劃重編譯等情況下,會造成不同。

3、為什麼要讀懂執行計劃

首先執行計劃讓你知道你複雜的sql到底是怎麼執行的,有沒有按照你想的方案執行,有沒有按照最高效的方式執行,使用啦衆多索引的哪一個,怎麼排序,怎麼合并資料的,有沒有造成不必要資源浪費等等。官方資料顯示,執行t-sql存在問題,80%都可以在執行計劃中找到答案。

4、針對圖形化執行計劃分析

執行計劃,可以以文本,xml,圖形化展示出來。本騙主要以圖形化執行計劃主導進行分析,然而執行計劃中包含78個可用的操作符,本篇也隻能對常用的進行分析,常用的幾乎就包含你日常所有的了。Msdn上有圖檔介紹:https://msdn.microsoft.com/zh-cn/library/ms175913(v=sql.90).aspx

5、怎麼看執行計劃

圖形化執行計劃是從上到下從又到左看的。

6、清除緩存的執行計劃

dbcc freeprocache

dbcc flushprocindb(db_id)

看懂圖形化執行計劃

1、連線

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

1、越粗表示掃描影響的行數愈多。

2、Actual Number of Rows  掃描中實際影響的的行數。

3、Estimated Number of Rows 預估掃描影響的行數。

4、Estimated row size 操作符生成的行的估計大小(位元組)。

5、Estimated Data Size 預估影響的資料的大小。

2、Tooltips,目前步驟執行資訊

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

Note:這個tips的資訊告訴我們執行的對象是什麼,采用的操作操作是什麼,查找的資料是什麼,使用的索引是什麼,排序與否,預估cpu、I/O、影響行數,實際行數等資訊。具體參數清單參見msdn:https://msdn.microsoft.com/zh-cn/library/ms178071(v=sql.90).aspx

3、Table Scan(表掃描)

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

當表中沒有聚集索引,又沒有合适索引的情況下,會出現這個操作。這個操作是很耗性能的,他的出現也意味着優化器要周遊整張表去查找你所需要的資料。

4、Clustered Index Scan(聚集索引掃描)、Index Scan(非聚集索引掃描)

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

這個圖示兩個操作都可以使用,一個聚集索引掃描,一個是非聚集索引掃描。

聚集索引掃描:聚集索引的資料體積實際是就是表本身,也就是說表有多少行多少列,聚集所有就有多少行多少列,那麼聚集索引掃描就跟表掃描差不多,也要進行全表掃描,周遊所有表資料,查找出你想要的資料。

非聚集索引掃描:非聚集索引的體積是根據你的索引建立情況而定的,可以隻包含你要查詢的列。那麼進行非聚集索引掃描,便是你非聚集中包含的列的所有行進行周遊,查找出你想要的資料。

5、Key Lookup(鍵值查找)

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

首先需要說的是查找,查找與掃描在性能上完全不是一個級别的,掃描需要周遊整張表,而查找隻需要通過鍵值直接提取資料,傳回結果,性能要好。

當你查找的列沒有完全被非聚集索引包含,就需要使用鍵值查找在聚集索引上查找非聚集索引不包含的列。

6、RID Lookoup(RID查找)

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

跟鍵值查找類似,隻不過RID查找,是需要查找的列沒有完全被非聚集索引包含,而剩餘的列所在的表又不存在聚集索引,不能鍵值查找,隻能根據行表示Rid來查詢資料。

7、Clustered Index Seek(聚集索引查找)、Index Seek(非聚集索引查找)

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

聚集索引查找和非聚集索引查找都是使用該圖示。

聚集索引查找:聚集索引包含整個表的資料,也就是在聚集索引的資料上根據鍵值取資料。

非聚集索引查找:非聚集索引包含建立索引時所包含列的資料,在這些非聚集索引的資料上根據鍵值取資料。

8、Hash join   三種實體連接配接merge、Hash、Loop 模型:https://blog.csdn.net/hzp666/article/details/107847358

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

這個圖示有兩種地方用到,一種是表關聯,一種是資料聚合運算時。

在分别說這兩種運算的前面,我先說說Hashing(編碼技術)和Hash Table(資料結構)。

Hashing:在資料庫中根據每一行的資料内容,轉換成唯一符号格式,存放到臨時哈希表中,當需要原始資料時,可以給還原回來。類似加密解密技術,但是他能更有效的支援資料查詢。

Hash Table:通過hashing處理,把資料以key/value的形式存儲在表格中,在資料庫中他被放在tempdb中。

接下來,來說說Hash Math的表關聯跟行資料聚合是怎麼操作運算的。

表關聯:

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

如上圖,關聯兩個資料集時,Hash Match會把其中較小的資料集,通過Hashing運算放入HashTable中,然後一行一行的周遊較大的資料集與HashTable進行相應的比對拉取資料。

資料聚合:當查詢中需要進行Count/Sum/Avg/Max/Min時,資料可能會采用把資料先放在記憶體中的HashTable中然後進行運算。

9、Loops Join

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

這個操作符号,把兩個不同列的資料集彙總到一張表中。提示資訊中的Output List中有兩個資料集,下面的資料集(inner set)會一一掃描與上面的資料集(out set),直到掃描完為止,這個操作才算是完成。

10、Merge Join

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

這種關聯算法是對兩個已經排過序的集合進行合并。如果兩個聚合是無序的則将先給集合排序再進行一一合并,由于是排過序的集合,左右兩個集合自上而下合并效率是相當快的。

11、Sort(排序)

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

對資料集合進行排序,需要注意的是,有些資料集合在索引掃描後是自帶排序的。

12、Filter(篩選)

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

根據出現在having之後的操作運算符,進行篩選

13、Computer Scalar

SqlServer執行計劃http://www.cnblogs.com/knowledgesea/p/5005163.html 序言執行計劃簡介看懂圖形化執行計劃根據執行計劃細節要做的優化操作

在需要查詢的列中需要自定義列,比如count(*) as cnt ,select name+''+age 等會出現此符号。

根據執行計劃細節要做的優化操作

這裡會有很多建議給出,我不一一舉例了,給出幾個示例,想做到優化行家,多的還需要大家去悟去了解。

1、如果select * 通常情況下聚集索引會比非聚集索引更優。

2、如果出現Nested Loops,需要查下是否需要聚集索引,非聚集索引是否可以包含所有需要的列。

3、Hash Match連接配接操作更适合于需要做Hashing算法集合很小的連接配接。

4、Merge Join時需要檢查下原有的集合是否已經有排序,如果沒有排序,使用索引能否解決。

5、出現表掃描,聚集索引掃描,非聚集索引掃描時,考慮語句是否可以加where限制,select * 是否可以去除不必要的列。

6、出現Rid查找時,是否可以加索引優化解決。

7、在計劃中看到不是你想要的索引時,看能否在語句中強制使用你想用的索引解決問題,強制使用索引的辦法Select CluName1,CluName2 from Table with(index=IndexName)。

8、看到不是你想要的連接配接算法時,嘗試強制使用你想要的算法解決問題。強制使用連接配接算法的語句:select * from t1 left join t2 on t1.id=t2.id option(Hash/Loop/Merge Join)

9、看到不是你想要的聚合算法是,嘗試強制使用你想要的聚合算法。強制使用聚合算法的語句示例:select  age ,count(age) as cnt from t1 group by age  option(order/hash group)

10、看到不是你想要的解析執行順序是,或這解析順序耗時過大時,嘗試強制使用你定的執行順序。option(force order)

11、看到有多個線程來合并執行你的sql語句而影響到性能時,嘗試強制是不并行操作。option(maxdop 1)

12、在存儲過程中,由于參數不同導緻執行計劃不同,也影響啦性能時嘗試指定參數來優化。option(optiomize for(@name='zlh'))

13、不操作多餘的列,多餘的行,不做務必要的聚合,排序。

繼續閱讀