sqlserver 執(zhí)行計劃
當前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
想復雜的事情簡單說,在看執(zhí)行計劃的其他文章的時候,發(fā)現(xiàn)直接上很復雜的DDL腳本來講解,這樣子可能打開就沒有興趣往下看了。所以這里用了一個最簡單的select語句進行說明引新入門。 打開 注意這三個【L型圖標】,可以把鼠標移動到按鈕上方可以顯示【解釋文字】。 圖中從左到右分別為【顯示估計的執(zhí)行計劃】【包括實際的執(zhí)行計劃】【包括實時查詢統(tǒng)計信息】。 【顯示估計的執(zhí)行計劃】是執(zhí)行某個DDL的估計值。 【包括實際的執(zhí)行計劃】【包括實時查詢統(tǒng)計信息】都是執(zhí)行實際的值,所以你選擇后,它會在下次執(zhí)行后出執(zhí)行結(jié)果。
結(jié)果分析 這是一個簡單的查詢,鼠標點擊圖片中的圖片或線上都有驚喜(大量細節(jié)信息展示)。執(zhí)行計劃可以通過“另存”操作將某一次結(jié)果保留下來,方便與日后進行結(jié)果對比。 除了圖標外,線的粗細代表涉及到的數(shù)據(jù)量的大小,越粗代表數(shù)據(jù)量越大。
執(zhí)行計劃元素列表如下:
執(zhí)行計劃元素列表解釋請參考: Graphical execution Plan Icons (SQL Server Management Studio) 結(jié)果細節(jié)圖
其中,第三個圖中的屬性Ordered是與order by相關(guān)。如下面兩個腳本: select * from vvtest order by id; select * from vvtest 兩個執(zhí)行計劃的結(jié)果如下:
所謂數(shù)據(jù)訪問就是直接訪問數(shù)據(jù),可以是訪問一個表也可以是訪問一個索引。 通常有兩種方法:一種是掃描(scan)一種是查找(seek)。 scan就是讀取整個結(jié)構(gòu),可以訪問一個heap或者一個clustered索引或者一個non-clustered索引。 seek不會讀取整個結(jié)構(gòu),他則是更高效地通過索引訪問一行,所以從這個角度來看,查找就只能應用在索引上面了。簡單總結(jié)如下表所示: 首先分析最右邊的Table Scan。這是sqlserver 查詢數(shù)據(jù)的方法。sqlserver 數(shù)據(jù)查詢方式一共有五種: 1. 【Table Scan】:遍歷整個表,查找所有匹配的記錄行。這個操作將會一行一行的檢查,當然,效率也是最差的。 2. 【Index Scan】:根據(jù)索引,從表中過濾出來一部分記錄,再查找所有匹配的記錄行,顯然比第一種方式的查找范圍要小,因此比【Table Scan】要快。 3. 【Index Seek】:根據(jù)索引,定位(獲?。┯涗浀拇娣盼恢?,然后取得記錄,因此,比起前二種方式會更快。 4. 【Clustered Index Scan】:和【Table Scan】一樣。注意:不要以為這里有個Index,就認為不一樣了。 其實它的意思是說:按聚集索引來逐行掃描每一行記錄,因為記錄就是按聚集索引來順序存放的。 而【Table Scan】只是說:要掃描的表沒有聚集索引而已,因此這二個操作本質(zhì)上也是一樣的。 5. 【Clustered Index Seek】:直接根據(jù)聚集索引獲取記錄,最快! 所以總體來講,在查詢結(jié)果集是相同數(shù)量的情況下,查詢速度排序為5>3>2>4>1。 一般而言,在性化時可以看到執(zhí)行記錄時是不是【Table Scan】或者【Clustered Index Scan】,如果是,可以通過增加或修改索引類型進行效率上的對比。 Lookup類型 Bookmark Lookup、RID Lookup、Key Lookup。 Bookmark Lookup和Key Lookup是一個意思,等價。 如果表沒有創(chuàng)建聚集索引則稱為Bookmark Lookup,如果表中沒有聚集索引但是存在非聚集索引我們稱為RID Lookup。 為什么突然扯了一嘴Lookup呢?因為Lookup其實就是與執(zhí)行計劃里的scan或index相關(guān)。如果聚集索引命中就是指Bookmark Lookup——聚集索引命中的時候,很大概率是索引不能帶出select所需的某一部分字段或者是全部字段,所以需要先命中一行,然后把某一行的數(shù)據(jù)全帶出來。非聚集索引命中就是指RID Lookup。 SQL SERVER如何選擇執(zhí)行計劃 sqlserver選擇某個執(zhí)行計劃,執(zhí)行計劃用某個索引,是這有一個權(quán)重判斷的。這個權(quán)重在執(zhí)行前都計算出來了。 那怎么查看呢——通過【索引統(tǒng)計信息】。在執(zhí)行腳本的過程中,sqlserver會根據(jù)這些統(tǒng)計信息,選擇一個它認為是最合適的方法去執(zhí)行查詢過程。統(tǒng)計信息可以自動定時更新,在SQL Server中也有個參數(shù)來控制這個更新方式。
語法 DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid); 這里的引號很重要,沒會報錯。 主要有兩個參數(shù): 第一個:是表名或者是索引視圖名(給視圖加的索引) 第二個:索引名、列名、統(tǒng)計信息。 結(jié)果屬性介紹 索引前綴集是什么?索引前綴和前綴索引不是一個東西。 索引前綴是指索引的選擇性——根據(jù)索引定義時的字段順序來決定索引是否被命中。如果是索引(a,b,c),命中查詢的時候是查詢條件中有(a) (a,b) (a,b,c)進行命中,但是(b,c)這個查詢條件不會命中該索引。所以索引前綴也叫索引列前綴集。 前綴索引說白了就是對文本的前幾個字符(具體是幾個字符在建立索引時指定)建立索引,這樣建立起來的索引更小,所以查詢更快。
執(zhí)行計劃詳細屬性介紹
在執(zhí)行DDL之前,輸入一句set statistics profile on 。顯示一個表格,表格內(nèi)是比圖上更細節(jié)的實際的執(zhí)行信息。針對這個表的屬性做一個整理解析。
該文章在 2023/7/26 8:49:40 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |