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