亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

淺析SQL Server中的執行計劃緩存(下)

2024-08-31 01:03:34
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了淺析SQL Server中的執行計劃緩存(下)的相關資料,需要的朋友可以參考下
 

在上篇文章給大家介紹了SQL Server中的執行計劃緩存(上),本文繼續給大家介紹sqlserver執行計劃緩存相關知識,小伙伴們一起學習吧。

簡介

在上篇文章中我們談到了查詢優化器和執行計劃緩存的關系,以及其二者之間的沖突。本篇文章中,我們會主要闡述執行計劃緩存常見的問題以及一些解決辦法。

將執行緩存考慮在內時的流程

上篇文章中提到了查詢優化器解析語句的過程,當將計劃緩存考慮在內時,首先需要查看計劃緩存中是否已經有語句的緩存,如果沒有,才會執行編譯過程,如果存在則直接利用編譯好的執行計劃。因此,完整的過程如圖1所示。

淺析SQL Server中的執行計劃緩存(下)

圖1.將計劃緩存考慮在內的過程

圖1中我們可以看到,其中有一步需要在緩存中找到計劃的過程。因此不難猜出,只要是這一類查找,一定跑不了散列(Hash)的數據結構。通過sys.dm_os_memory_cache_hash_tables這個DMV可以找到有關該Hash表的一些信息,如圖2所示。這里值得注意的是,當執行計劃過多導致散列后的對象在同一個Bucket過多時,則需要額外的Bucket,因此可能會導致查找計劃緩存效率低下。解決辦法是盡量減少在計劃緩存中的計劃個數,我們會在本文后面討論到。

淺析SQL Server中的執行計劃緩存(下)

圖2.有關存儲計劃緩存的HashTable的相關信息

當出現這類問題時,我們可以在buckets_avg_scan_miss_length列看出問題。這類情況在緩存命中率(SQL Server: Plan Cache-Cache Hit Ratio)比較高,但編譯時間過長時可以作為考慮對象。

參數化和非參數化

查詢計劃的唯一標識是查詢語句本身,但假設語句的主體一樣,而僅僅是查詢條件謂詞不一樣,那在執行計劃中算1個執行計劃還是兩個執行計劃呢?It's Depends。

假設下面兩個語句,如圖3所示。

淺析SQL Server中的執行計劃緩存(下)

圖3.僅僅謂詞條件不一樣的兩個語句

雖然執行計劃一樣,但是在執行計劃緩存中卻會保留兩份執行計劃,如圖4所示。

淺析SQL Server中的執行計劃緩存(下)

圖4.同一個語句,不同條件,有兩份不同的執行計劃緩存

我們知道,執行計劃緩存依靠查詢語句本身來判別緩存,因此上面兩個語句在執行計劃緩存中就被視為兩個不同的語句。那么解決該問題的手段就是使得執行計劃緩存中的查詢語句一模一樣。

參數化

    使得僅僅是某些參數不同,而查詢本身相同的語句可以復用,就是參數化的意義所在。比如說圖3中的語句,如果我們啟用了數據庫的強制參數化,或是使用存儲過程等。SQL Server會將這些語句強制參數話,比如說我們根據圖5修改了數據庫層級的選項。

淺析SQL Server中的執行計劃緩存(下)

圖5.數據庫層級的選項

此時我們再來執行圖3中的兩條語句,通過查詢執行計劃緩存,我們發現變量部分被參數化了,從而在計劃緩存中的語句變得一致,如圖6所示,從而可以復用.

淺析SQL Server中的執行計劃緩存(下)

圖6.參數話之后的查詢語句

但是,強制參數會引起一些問題,查詢優化器很多時候就無法根據統計信息最優化一些具體的查詢,比如說不能應用一些索引或者該掃描的時候卻查找。所產生的負面影響在上篇文章中已經說過,這里就不細說了。

因此對于上面的問題可以有幾種解決辦法。

平衡參數化和非參數化

在具體的情況下,參數化有些時候是好的,但有些時候卻是性能問題的罪魁禍首,下面我們來看幾種平衡這兩者之間關系的手段。

使用RECOMPILE

當查詢中,不準確的執行計劃的成本要高于編譯的成本時,在存儲過程中使用RECOMPILE選項或是在即席查詢中使用RECOMPILE提示使得每次查詢都會重新生成執行計劃,該參數會使得生成的執行計劃不會被插入到執行計劃緩存中。對于OLAP類查詢來說,不準確的執行計劃所耗費的成本往往高于編譯成本太多,所以可以考慮該參數或選項,您可以如代碼清單1中的查詢所示這樣使用Hint。

SELECT * FROM Sales.CustomerWHERE CustomerID>20000 AND TerritoryID = 4OPTION (recompile)

代碼清單1.使用Recompile

除去我們可以手動提示SQL Server重編譯之外,SQL Server也會在下列條件下自動重編譯:

元數據變更,比如說表明稱改變、刪除列、變更數據類型等。
統計信息變更。

連接的SET參數變化,SET ANSI_NULLS等的值不一樣,會導致緩存的執行計劃不能被復用,從而重編譯。這也是為什么我們看到緩存的執行計劃中語句一模一樣,但就是不復用,還需要相關的參數一致,這些參數可以通過sys.dm_exec_plan_attributes來查看。

使用Optimize For參數

RECOMPILE方式提供了完全不使用計劃緩存的節奏。但有些時候,特性謂語的執行計劃被使用的次數h更多,比如說,僅僅那些謂語條件產生大量返回結果集的參數編譯,我們可以考慮Optimize For參數。比如我們來看代碼清單2。

DECLARE @vari INTSET @vari=4SELECT * FROM Sales.CustomerWHERE CustomerID>20000 AND TerritoryID = @variOPTION (OPTIMIZE FOR (@vari=4))

代碼清單2.使用OPTIMIZE FOR提示

使用了該參數會使得緩存的執行計劃按照OPTIMIZE FOR后面的謂語條件來生成并緩存執行計劃,這也可能造成不在該參數中的查詢效率低下,但是該參數是我們選擇的,因此通常我們知道哪些謂語條件會被使用的多一些。

另外,自SQL Server 2008開始多了一個OPTIMIZE FOR UNKNOWN參數,這使得在優化查詢的過程中探測作為謂語條件的局部參數的值,而不是根據局部變量的初始值去探測統計信息。

在存儲過程中使用局部變量代替存儲過程參數

在存儲過程中不使用過程參數,而是使用局部變量相當于直接禁用參數嗅探。畢竟,局部變量的值只有在運行時才能知道,在執行計劃被查詢優化器編譯時是無法知道該值的,因此強迫查詢分析器使用條件列的平均值進行估計。

雖然這種方式使得參數估計變得非常不準確,但是會變得非常穩定,畢竟統計信息不會變更的過于頻繁。該方式不被推薦,如果可能,盡量使用Optimizer的方式。

代碼清單3展示了這種方式。

CREATE PROC TestForLocalVari@vv INTASDECLARE @vari INTSET @vari=@vvSELECT * FROM Sales.CustomerWHERE CustomerID>20000 AND TerritoryID = @vari

代碼清單3.直接引用局部變量,而不是存儲過程參數

強制參數化

在本篇文章的前面已經提到過了強制參數化,這里就不再提了。

使用計劃指導

在某些情況下,我們的環境不允許我們直接修改SQL語句,比如所不希望破壞代碼的邏輯性或是應用程序是第三方開發,因此無論是加HINT或參數都變得不現實。此時我們可以使用計劃指導。

計劃指導使得查詢語句在由客戶端應用程序扔到SQL Server的時候,SQL Server對其加上提示或選項,比如說通過代碼清單4可以看到一個計劃指導的例子。

EXEC sp_create_plan_guide N'MyPlanGuide1',@stmt=N'SELECT * FROM Sales.Customer WHERE CustomerID>20000 AND TerritoryID=@vari',@type=N'sql',@module_or_batch=NULL,@params=N'@vari int',@hints=N'OPTION (RECOMPILE)'

代碼清單4.對我們前面的查詢設置計劃指導

當加入了計劃指導后,當批處理到達SQL Server時,在查找匹配的計劃緩存時也會去找是否有計劃指導和其相匹配。如果匹配,則應用計劃指導中的提示或選項。這里要注意的是,這里@stmt參數必須和查詢語句中的一句一模一樣,差一個空格都會被認為不匹配。

PARAMETERIZATION SIMPLE

當我們在數據庫層級啟用了強制參數化時,對于特定語句,我們卻不想啟用強制參數化,我們可以使用PARAMETERIZATION SIMPLE選項,如代碼清單5所示。

DECLARE @stmt NVARCHAR(MAX)DECLARE @params NVARCHAR(MAX)EXEC sp_get_query_template N'SELECT * FROM Sales.Customer WHERE CustomerID>20000 AND TerritoryID=2',@stmt OUTPUT, @params OUTPUTPRINT @stmtPRINT @paramsEXEC sp_create_plan_guide N'MyTemplatePlanGuide', @stmt, N'TEMPLATE', NULL, @params, N'OPTION(PARAMETERIZATION SIMPLE)'

代碼清單5.通過計劃指南對單條語句應用簡單參數化

小結

執行計劃緩存希望盡量重用執行計劃,這會減少編譯所消耗的CPU和執行緩存所消耗的內存。而查詢優化器希望盡量生成更精準的執行計劃,這勢必會造成大量的執行計劃,這不僅僅可能引起重編譯大量消耗CPU,還會造成內存壓力,甚至當執行計劃緩存過多超過BUCKET的限制時,在緩存中匹配執行計劃的步驟也會消耗更多的時間。

因此利用本篇文章中所述的方法基于實際的情況平衡兩者之間的關系,就變得非常重要。



注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美资源在线| 亚洲午夜未满十八勿入免费观看全集| 亚洲精品免费在线视频| 亚洲第一视频在线观看| 日本中文字幕久久看| 日韩中文综合网| 91久久国产综合久久91精品网站| 欧美成人一区二区三区电影| 欧美日韩亚洲激情| 国产综合香蕉五月婷在线| 成人天堂噜噜噜| 国产成人中文字幕| 国产日韩在线亚洲字幕中文| 全亚洲最色的网站在线观看| 国产精品第100页| 国产精品黄色影片导航在线观看| 亚洲影院色在线观看免费| 中文字幕一区二区三区电影| 国产精品美女无圣光视频| 国产免费一区二区三区香蕉精| 久久精品久久久久电影| 国产精品久久久久久亚洲影视| 久久久免费电影| 国产精品草莓在线免费观看| 亚洲精品成人av| 久久不射热爱视频精品| 理论片在线不卡免费观看| 欧美日本高清一区| 亚洲深夜福利在线| 亚洲欧洲高清在线| 久久久久久久av| 久久久av亚洲男天堂| 日韩av成人在线| 色偷偷av一区二区三区| 国产精品美女在线观看| 88xx成人精品| 国产在线播放不卡| 国产精品美女久久久免费| 欧美国产日产韩国视频| 一区二区三区四区在线观看视频| 欧美激情一区二区三区成人| 91精品国产91久久久久| 成人免费视频网址| 欧美电影院免费观看| 日韩不卡在线观看| 国产亚洲精品久久久久久牛牛| 久久97久久97精品免视看| 91精品视频在线| 欧美一区二粉嫩精品国产一线天| 日本成熟性欧美| 91免费看片网站| 亚洲欧洲国产一区| 成人免费在线视频网站| 色吧影院999| 国产成人一区二区在线| 亚洲综合成人婷婷小说| 91成人免费观看网站| 亚洲精品久久久久久久久久久久| 中文字幕欧美专区| 欧美一级在线亚洲天堂| 亚洲第一黄色网| 亚洲免费一在线| 欧美人与性动交a欧美精品| 精品视频在线播放免| 国产精品综合不卡av| 国产一区二区精品丝袜| 国产精品久久久久久久久久久久久久| 久久久久久久一区二区| 在线观看欧美www| 成人免费在线视频网址| 91久久国产婷婷一区二区| 国产色视频一区| 欧美日韩电影在线观看| 91精品久久久久| 97视频在线观看视频免费视频| 92国产精品久久久久首页| 亚洲天堂免费在线| 亚洲黄一区二区| 韩国19禁主播vip福利视频| 亚洲视频999| 欧美裸身视频免费观看| 亚洲视频在线观看网站| 欧美日韩激情视频8区| 日韩精品免费在线播放| 91国产美女在线观看| 欧美猛男性生活免费| 久热精品视频在线| 久久777国产线看观看精品| 97在线免费观看| 日韩国产精品视频| 日韩成人av网址| 操91在线视频| 啊v视频在线一区二区三区| 亚洲一级一级97网| 国产精品久久久久国产a级| 久久精品国产精品亚洲| 欧美日本国产在线| 欧美日韩福利电影| 色中色综合影院手机版在线观看| 日韩av在线天堂网| 欧美亚洲午夜视频在线观看| 色综合视频网站| 国产精品网址在线| 国产日韩欧美在线观看| 成人中心免费视频| 国产在线观看91精品一区| 亚洲精品女av网站| 久久精品国产欧美亚洲人人爽| 亚洲变态欧美另类捆绑| 亚洲一区二区三区四区视频| 国产精品福利小视频| 久久不射热爱视频精品| 日韩欧美成人精品| 91精品国产高清自在线看超| 亚洲欧美日韩一区在线| 国产成人一区二区在线| 51视频国产精品一区二区| 亚洲精品国产福利| 精品久久香蕉国产线看观看亚洲| 国产综合香蕉五月婷在线| 国产精品入口日韩视频大尺度| 亚洲精品按摩视频| 亚洲精品白浆高清久久久久久| 日韩在线高清视频| 久久精品一本久久99精品| 亚洲精品一区中文字幕乱码| 欧美国产日产韩国视频| 久久99热精品| 久久久av电影| 国产在线精品自拍| 久久久91精品| 欧美日韩激情网| 国产精品免费福利| 这里只有视频精品| 久久久av电影| 国产自产女人91一区在线观看| 国产综合在线观看视频| 日韩一区视频在线| 777国产偷窥盗摄精品视频| 91久久精品美女| 国产视频久久久| 亚洲欧洲免费视频| 亚洲一区二区三区视频| 国产精品欧美激情| 亚洲男人av电影| 日韩网站免费观看高清| 久久国产精品影视| 51精品在线观看| 亚洲欧洲国产伦综合| 日韩在线国产精品| 91高潮精品免费porn| 亚洲视频专区在线| 欧美性xxxxx极品娇小| 久久久成人精品视频| 高清日韩电视剧大全免费播放在线观看| 国产mv免费观看入口亚洲| 黑人精品xxx一区| 成人美女av在线直播| 国产精品日韩专区| 国产视频在线观看一区二区| 宅男66日本亚洲欧美视频| 最近2019中文字幕在线高清| 中文字幕亚洲专区| 日韩精品小视频|