日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

查询优化器内核剖析第四篇:从一个实例看执行计划

發(fā)布時(shí)間:2023/11/29 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 查询优化器内核剖析第四篇:从一个实例看执行计划 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
查詢優(yōu)化器內(nèi)核剖析第四篇:從一個(gè)實(shí)例看執(zhí)行計(jì)劃 系列文章索引:???????
查詢優(yōu)化器內(nèi)核剖析第一篇??????
查詢優(yōu)化器內(nèi)核剖析第二篇:產(chǎn)生候選執(zhí)行計(jì)劃&執(zhí)行計(jì)劃成本估算
查詢優(yōu)化器內(nèi)核剖析第三篇:查詢的執(zhí)行與計(jì)劃的緩存 & Hint提示?
查詢優(yōu)化器內(nèi)核剖析第四篇:從一個(gè)實(shí)例看執(zhí)行計(jì)劃?
?查詢優(yōu)化器內(nèi)核剖析第五篇:進(jìn)一步的了解執(zhí)行計(jì)劃
查詢優(yōu)化器內(nèi)核剖析第七篇:執(zhí)行引擎之?dāng)?shù)據(jù)訪問操作---Scan
?
??? 這幾天也收到了一些朋友的來信說:為什么你花這么多的時(shí)間將這些東西,直接告訴我性能優(yōu)化的方法就行了。這個(gè)問題,其實(shí)早就說過了:學(xué)習(xí)查詢優(yōu)化器不是我們的目的,而是通過它,我們掌握SQL Server是如何處理我們的SQL的,掌握?qǐng)?zhí)行計(jì)劃,掌握為什么產(chǎn)生I/O問題,為什么CPU使用老高,為什么你的索引加了不起作用… ??? 如果,我告訴你,你去加個(gè)索引,換SAN存儲(chǔ),這樣意義不大!數(shù)據(jù)庫優(yōu)化就是這樣的:沒有所謂的“絕對(duì)手段,一下子把性能搞上去,一切都是看情況而定”,都是通過不斷的分析,抽絲剝解。不帶頭腦的優(yōu)化,能好到那里去? ?????在前幾篇文章中,我們已經(jīng)談了一些查詢優(yōu)化器的相關(guān)的基礎(chǔ)介紹,也大致的了解了它到底是干什么的。查詢優(yōu)化器的結(jié)果就是產(chǎn)生執(zhí)行計(jì)劃,執(zhí)行計(jì)劃就是一個(gè)樹,這個(gè)樹由很多的物理操作組成,而這些物理操作就定義了如何去存儲(chǔ)設(shè)備中去獲取數(shù)據(jù)。 ???? 我們可以以很多的不同的方式,例如圖形化,文本,XML的形式來查看一個(gè)給定查詢的實(shí)際的執(zhí)行計(jì)劃和估計(jì)的執(zhí)行計(jì)劃。這些不同格式的執(zhí)行計(jì)劃的區(qū)別主要在于包含的信息的詳細(xì)程度不同。 ?????? ??? 當(dāng)需要查看一個(gè)查詢的實(shí)際的執(zhí)行計(jì)劃的時(shí)候,這個(gè)查詢比較要執(zhí)行。然而,如果查看估計(jì)的執(zhí)行計(jì)劃,此時(shí)整個(gè)查詢是不需要實(shí)際執(zhí)行的。如果查詢是個(gè)需要消耗很長時(shí)間,很多資源的查詢,我們?cè)诜治鰡栴}的時(shí)候,會(huì)先查看這個(gè)查詢估計(jì)的執(zhí)行計(jì)劃,并且這樣做也不會(huì)對(duì)使用數(shù)據(jù)庫的其他用戶產(chǎn)生影響。 ?????查看實(shí)際執(zhí)行計(jì)劃和估計(jì)的執(zhí)行計(jì)劃方式有很多,最簡單的方式就是在SQL Server管理界面點(diǎn)擊如下按鈕: ?????查看估計(jì)的執(zhí)行計(jì)劃 查看實(shí)際的執(zhí)行計(jì)劃?: ??? 下面,我們就來通過一個(gè)簡單的示例講述執(zhí)行計(jì)劃,這里采用示例數(shù)據(jù)庫:AdventureWorks。 ?????我們?cè)赟QL Server中輸入以下查詢: ??? 然后,點(diǎn)擊“Include Actual Execution Plan”按鈕,然后執(zhí)行SQL語句,看到如下顯示: ??? 在圖中,我們可以看到一些物理操作符號(hào)以圖標(biāo)顯示,例如Index Scan,Hash Aggregate。第一個(gè)圖標(biāo)稱為結(jié)果操作符,它返回了查詢的結(jié)果。 ????? ??? 每一個(gè)物理的操作符,其實(shí)就是存儲(chǔ)引擎中實(shí)現(xiàn)的一些基本的操作或者方法。例如,一個(gè)邏輯的join(就是我們?cè)赟QL寫的inner join之類的),可以再執(zhí)行計(jì)劃中以不同的物理join操作實(shí)現(xiàn)(Nested Loops Join, Merge Join, Hash Join)。當(dāng)然,這里沒有所謂的“那種物理操作好,哪種不好”,得看具體情況。 ?????????? ??? 每個(gè)物理操作執(zhí)行的時(shí)候,就會(huì)去獲取一些數(shù)據(jù),然后將數(shù)據(jù)傳遞給它下一個(gè)物理操作,知道全部的操作完成,返回結(jié)果。在查看執(zhí)行計(jì)劃的時(shí)候,需要“從右向左,從下到上”進(jìn)行。 在執(zhí)行計(jì)劃中,每個(gè)物理操作都有一些“箭頭”相連,這些箭頭就表明了執(zhí)行的先后順序,并且箭頭的粗細(xì)也放映了傳遞數(shù)據(jù)的多少,越粗就表明數(shù)據(jù)越多。?????????? ?? ??? ?我們可以通過把鼠標(biāo)放在這些箭頭上面,查看更多的信息。如下: ?? 通過查看提示信息,我們可以知道:Index Scan這個(gè)操作讀取了19614條數(shù)據(jù),這些數(shù)據(jù)之后被傳遞給了Hash? Aggregate操作。Hash? Aggregate執(zhí)行之后,就將這些數(shù)據(jù)通過City字段做了一個(gè)distinct的處理,將575條數(shù)據(jù)給了下一個(gè)操作: ??? 對(duì)于執(zhí)行計(jì)劃中出現(xiàn)的一些物理操作,一般基本會(huì)通過三個(gè)方法來實(shí)現(xiàn)它們的功能(這里要把操作和方法的概念搞清楚,可能在很多的編程語言中,一個(gè)操作就是一個(gè)方法,或者說操作就是方法,這里的操作和方法和那些不同,一個(gè)操作是有幾個(gè)方法來實(shí)現(xiàn)和完成的,為了便于理解,大家這里就把每一個(gè)操作理解為一個(gè)類吧): ?????????????? Open()方法:這個(gè)方法初始化一個(gè)物理操作 ?????????????? GetRow()方法:這個(gè)方法每次都從它的上一個(gè)操作中獲取一行數(shù)據(jù) ?????????????? Close()方法:執(zhí)行完畢,做一些相關(guān)的清理等工作 ?????????????? ??? 因?yàn)镚etRow()方法每次只能從上一個(gè)操作中獲取一個(gè)數(shù)據(jù),那么如果上一個(gè)操作傳遞了很多的數(shù)據(jù),那么這個(gè)物理操作就要多次調(diào)用上一個(gè)操作的GetRow()方。在上面的例子中,Hash? Aggregate操作只調(diào)用一次Index Scan的Open()方法,然后調(diào)用19615次Index Scan的GetRow()方法,最后調(diào)用一次Index Scan的Close()方法。 ??? 其實(shí)我們還可以通過這個(gè)圖形化的執(zhí)行計(jì)劃得到更多的信息!為了使得大家更好地消化今天的知識(shí),余下的內(nèi)容,下次接著講述。

轉(zhuǎn)載于:https://blog.51cto.com/yanyangtian/814688

總結(jié)

以上是生活随笔為你收集整理的查询优化器内核剖析第四篇:从一个实例看执行计划的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。