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

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

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

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

簡介

我們平時所寫的SQL語句本質只是獲取數據的邏輯,而不是獲取數據的物理路徑。當我們寫的SQL語句傳到SQL Server的時候,查詢分析器會將語句依次進行解析(Parse)、綁定(Bind)、查詢優化(Optimization,有時候也被稱為簡化)、執行(Execution)。除去執行步驟外,前三個步驟之后就生成了執行計劃,也就是SQL Server按照該計劃獲取物理數據方式,最后執行步驟按照執行計劃執行查詢從而獲得結果。但查詢優化器不是本篇的重點,本篇文章主要講述查詢優化器在生成執行計劃之后,緩存執行計劃的相關機制以及常見問題。

為什么需要執行計劃緩存

從簡介中我們知道,生成執行計劃的過程步驟所占的比例眾多,會消耗掉各CPU和內存資源。而實際上,查詢優化器生成執行計劃要做更多的工作,大概分為3部分:

首先,根據傳入的查詢語句文本,解析表名稱、存儲過程名稱、視圖名稱等。然后基于邏輯數據操作生成代表查詢文本的樹。

第二步是優化和簡化,比如說將子查詢轉換成對等的連接、優先應用過濾條件、刪除不必要的連接(比如說有索引,可能不需要引用原表)等。

第三步根據數據庫中的統計信息,進行基于成本(Cost-based)的評估。

上面三個步驟完成之后,才會生成多個候選執行計劃。雖然我們的SQL語句邏輯上只有一個,但是符合這個邏輯順序的物理獲取數據的順序卻可以有多條,打個比方,你希望從北京到上海,即可以做高鐵,也可以做飛機,但從北京到上海這個描述是邏輯描述,具體怎么實現路徑有多條。那讓我們再看一個SQL Server中的舉例,比如代碼清單1中的查詢。

SELECT * FROM A INNER JOIN B ON a.a=b.bINNER JOIN C ON c.c=a.a

代碼清單1.

對于該查詢來說,無論A先Inner join B還是B先Inner Join C,結果都是一樣的,因此可以生成多個執行計劃,但一個基本原則是SQL Server不一定會選擇最好的執行計劃,而是選擇足夠好的計劃,這是由于評估所有的執行計劃的成本所消耗的成本不應該過大。最終,SQL Server會根據數據的基數和每一步所消耗的CPU和IO的成本來評估執行計劃的成本,所以執行計劃的選擇重度依賴于統計信息,關于統計信息的相關內容,我就不細說了。

對于前面查詢分析器生成執行計劃的過程不難看出,該步驟消耗的資源成本也是驚人的。因此當同樣的查詢執行一次以后,將其緩存起來將會大大減少執行計劃的編譯,從而提高效率,這就是執行計劃緩存存在的初衷。

執行計劃所緩存的對象

執行計劃所緩存的對象分為4類,分別是:

編譯后的計劃:編譯的執行計劃和執行計劃的關系就和MSIL和C#的關系一樣。

執行上下文:在執行編譯的計劃時,會有上下文環境。因為編譯的計劃可以被多個用戶共享,但查詢需要存儲SET信息以及本地變量的值等,因此上下文環境需要對應執行計劃進行關聯。執行上下文也被稱為Executable Plan。

游標:存儲的游標狀態類似于執行上下文和編譯的計劃的關系。游標本身只能被某個連接使用,但游標關聯的執行計劃可以被多個用戶共享。

代數樹:代數樹(也被稱為解析樹)代表著查詢文本。正如我們之前所說,查詢分析器不會直接引用查詢文本,而是代數樹。這里或許你會有疑問,代數樹用于生成執行計劃,這里還緩存代數樹干毛???這是因為視圖、Default、約束可能會被不同查詢重復使用,將這些對象的代數樹緩存起來省去了解析的過程。

比如說我們可以通過dm_exec_cached_plans這個DMV找到被緩存的執行計劃,如圖1所示。

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

圖1.被緩存的執行計劃

那究竟這幾類對象緩存所占用的內存相關信息該怎么看呢?我們可以通過dm_os_memory_cache_counters這個DMV看到,上述幾類被緩存的對象如圖2所示。

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

圖2.在內存中這幾類對象緩存所占用的內存

另外,執行計劃緩存是一種緩存。而緩存中的對象會根據算法被替換掉。對于執行計劃緩存來說,被替換的算法主要是基于內存壓力。而內存壓力會被分為兩種,既內部壓力和外部壓力。外部壓力是由于Buffer Pool的可用空間降到某一臨界值(該臨界值會根據物理內存的大小而不同,如果設置了最大內存則根據最大內存來)。內部壓力是由于執行計劃緩存中的對象超過某一個閾值,比如說32位的SQL Server該閾值為40000,而64位中該值被提升到了160000。

這里重點說一下,緩存的標識符是查詢語句本身,因此select * from SchemaName.TableName和Select * from TableName雖然效果一致,但需要緩存兩份執行計劃,所以一個Best Practice是在引用表名稱和以及其他對象的名稱時,請帶上架構名稱。
基于被緩存的執行計劃對語句進行調優

被緩存的執行計劃所存儲的內容非常豐富,不僅僅包括被緩存的執行計劃、語句,還包括被緩存執行計劃的統計信息,比如說CPU的使用、等待時間等。但這里值得注意的是,這里的統計只算執行時間,而不算編譯時間。比如說我們可以利用代碼清單2中的代碼根據被緩存的執行計劃找到數據庫中耗時最長的20個查詢語句。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDSELECT TOP 20  CAST(qs.total_elapsed_time / 1000000.0 AS DECIMAL(28, 2))                    AS [Total Duration (s)]  , CAST(qs.total_worker_time * 100.0 / qs.total_elapsed_time                 AS DECIMAL(28, 2)) AS [% CPU]  , CAST((qs.total_elapsed_time - qs.total_worker_time)* 100.0 /     qs.total_elapsed_time AS DECIMAL(28, 2)) AS [% Waiting]  , qs.execution_count  , CAST(qs.total_elapsed_time / 1000000.0 / qs.execution_count         AS DECIMAL(28, 2)) AS [Average Duration (s)]  , SUBSTRING (qt.text,(qs.statement_start_offset/2) + 1,     ((CASE WHEN qs.statement_end_offset = -1    THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2    ELSE qs.statement_end_offset    END - qs.statement_start_offset)/2) + 1) AS [Individual Query  , qt.text AS [Parent Query]  , DB_NAME(qt.dbid) AS DatabaseName  , qp.query_plan FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp WHERE qs.total_elapsed_time > 0 ORDER BY qs.total_elapsed_time DESC

代碼清單2.通過執行計劃緩存找到數據庫總耗時最長的20個查詢語句

上面的語句您可以修改Order By來根據不同的條件找到你希望找到的語句,這里就不再細說了。

相比較于無論是服務端Trace還是客戶端的Profiler,該方法有一定優勢,如果通過捕捉Trace再分析的話,不僅費時費力,還會給服務器帶來額外的開銷,通過該方法找到耗時的查詢語句就會簡單很多。但是該統計僅僅基于上次實例重啟或者沒有運行DBCC FreeProcCache之后。但該方法也有一些弊端,比如說:

類似索引重建、更新統計信息這類語句是不緩存的,而這些語句成本會非常高。
緩存可能隨時會被替換掉,因此該方法無法看到不再緩存中的語句。
該統計信息只能看到執行成本,無法看到編譯成本。
沒有參數化的緩存可能同一個語句呈現不同的執行計劃,因此出現不同的緩存,在這種情況下統計信息無法累計,可能造成不是很準確。

執行計劃緩存和查詢優化器的矛盾

還記得我們之前所說的嗎,執行計劃的編譯和選擇分為三步,其中前兩步僅僅根據查詢語句和表等對象的metadata,在執行計劃選擇的階段要重度依賴于統計信息,因此同一個語句僅僅是參數的不同,查詢優化器就會產生不同的執行計劃,比如說我們來看一個簡單的例子,如圖3所示。

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

圖3.僅僅是由于不同的參數,查詢優化器選擇不同的執行計劃

大家可能會覺得,這不是挺好的嘛,根據參數產生不同的執行計劃。那讓我們再考慮一個問題,如果將上面的查詢放到一個存儲過程中,參數不能被直接嗅探到,當第一個執行計劃被緩存后,第二次執行會復用第一次的執行計劃!雖然免去了編譯時間,但不好的執行計劃所消耗的成本會更高!讓我們來看這個例子,如圖4所示。

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

圖4.不同的參數,卻是完全一樣的執行計劃! 

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

再讓我們看同一個例子,把執行順序顛倒后,如圖5所示。

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

圖5.執行計劃完全變了

我們看到,第二次執行的語句,完全復用了第一次的執行計劃。那總會有一個查詢犧牲。比如說當參數為4時會有5000多條,此時索引掃描應該最高效,但圖4卻復用了上一個執行計劃,使用了5000多次查找!??!這無疑是低效率的。而且這種情況出現會非常讓DBA迷茫,因為在緩存中的執行計劃不可控,緩存中的對象隨時可能被刪除,誰先執行誰后執行產生的性能問題往往也讓DBA頭疼。

由這個例子我們看出,查詢優化器希望盡可能選擇高效的執行計劃,而執行計劃緩存卻希望盡可能的重用緩存,這兩種機制在某些情況會產生沖突。

在下篇文章中,我們將會繼續來看由于執行計劃緩存和查詢分析器的沖突,以及編譯執行計劃所帶來的常見問題和解決方案。

小結

本篇文章中,我們簡單講述了查詢優化器生成執行計劃的過程,以及執行計劃緩存的機制。當查詢優化器和執行計劃緩存以某種不好的情況交匯時,將產生一些問題。在下篇文章中,我們會繼續探索SQL Server中的執行計劃緩存。

以上內容是小編給大家介紹的SQL Server中的執行計劃緩存(上)的全部敘述,希望大家喜歡。



注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲亚裔videos黑人hd| 欧美福利视频网站| 国产精品成人一区二区| 国产欧美日韩丝袜精品一区| 97热在线精品视频在线观看| 精品人伦一区二区三区蜜桃网站| 国产精品三级在线| 亚洲伊人一本大道中文字幕| 日韩亚洲在线观看| 亚洲精品videossex少妇| www.日本久久久久com.| 亚洲精品有码在线| 亚洲一区美女视频在线观看免费| 精品久久久久久久久国产字幕| 久久人体大胆视频| 欧美亚洲在线播放| 成人精品久久久| 欧美最猛黑人xxxx黑人猛叫黄| 日韩精品视频三区| 亚洲激情久久久| www.99久久热国产日韩欧美.com| 欧美老女人在线视频| 成人福利视频网| 久久综合电影一区| 欧美一级大片在线观看| 欧洲亚洲免费在线| 亚洲国产成人在线视频| 久久精品人人爽| 国产v综合v亚洲欧美久久| 国产91精品久| 91天堂在线观看| 欧美激情国产日韩精品一区18| 日韩av高清不卡| 狠狠爱在线视频一区| 亚洲精品美女久久久| 亚洲欧美中文日韩v在线观看| 国产香蕉一区二区三区在线视频| 中文字幕精品久久| 欧美大片在线看免费观看| 成人国产在线视频| 国产精品人成电影| 狠狠干狠狠久久| 亚洲高清免费观看高清完整版| 亚洲欧洲一区二区三区在线观看| 91亚洲精品在线观看| 久久6精品影院| 欧美国产在线视频| 亚洲国产欧美一区二区三区久久| 色爱av美腿丝袜综合粉嫩av| 91po在线观看91精品国产性色| 亚洲第一黄色网| 国产精品h在线观看| 日韩欧美在线播放| 久久久亚洲福利精品午夜| 欧美美最猛性xxxxxx| 精品免费在线观看| 日韩av网站大全| 欧美激情极品视频| 亚洲天堂av在线免费| 欧美电影免费观看网站| 欧美激情精品久久久久久久变态| 精品中文字幕在线2019| 久久中文字幕国产| 91国在线精品国内播放| 国产精品日韩久久久久| 国产+人+亚洲| 亚洲免费一在线| 欧美激情图片区| 欧美一级视频在线观看| 成人网欧美在线视频| 成人性生交大片免费看视频直播| 亚洲国产欧美久久| 亚洲色图av在线| 亚洲成人精品久久| 91性高湖久久久久久久久_久久99| 日本一本a高清免费不卡| 亚洲人成电影网站色xx| 国产综合香蕉五月婷在线| 欧美日韩免费在线| 国产欧美一区二区三区四区| 久久香蕉精品香蕉| 少妇高潮 亚洲精品| 国产精品免费久久久| 久久躁日日躁aaaaxxxx| 国产精品女人久久久久久| 国产99视频在线观看| 国产97在线|日韩| 亚洲va国产va天堂va久久| 国产精品久久久久av免费| 欧美激情免费视频| 久久99亚洲热视| 亚洲直播在线一区| 精品国产一区二区三区四区在线观看| 亚洲最新在线视频| 欧美大胆a视频| 欧美日韩在线观看视频| 日韩精品中文字幕在线| 国产成人av在线播放| 亚洲福利在线播放| 欧美性猛交xxxxx免费看| 九九精品在线观看| 国产一区二区黑人欧美xxxx| 欧美精品videos另类日本| 欧美在线性视频| 欧美国产日韩精品| 亚洲欧美国产另类| 欧美日韩成人在线观看| 精品国产91久久久久久| 日本欧美黄网站| 欧美性视频网站| 7777精品久久久久久| 国产精品精品视频一区二区三区| x99av成人免费| 久久久国产精品x99av| 亚洲精品久久久久久久久| 中文日韩电影网站| 国产成人综合亚洲| 亚洲欧美在线一区| 欧美成在线观看| 欧美中文在线视频| 亚洲免费电影在线观看| 亚洲永久免费观看| 亚洲成人中文字幕| 欧美中文在线观看| 国产精品一区二区性色av| 国产成人精品一区二区三区| 九九热最新视频//这里只有精品| 亚洲激情小视频| 精品亚洲一区二区三区在线观看| 91精品久久久久久久久久久| 高清欧美一区二区三区| 精品国产一区二区三区久久久| 国产精品久久网| 中文字幕日韩精品在线观看| 欧美视频一区二区三区…| 亚洲第一区在线观看| 日韩69视频在线观看| 成人性生交大片免费看视频直播| 久久精品一本久久99精品| 91精品久久久久久久久久入口| 在线视频免费一区二区| 亚洲精品免费在线视频| 亚洲欧美日韩国产成人| 色综合天天综合网国产成人网| 国产精品男人爽免费视频1| 日韩精品免费在线| 欧美激情国产日韩精品一区18| 国产成人久久久| 欧美理论电影网| 亚洲高清福利视频| 国产日韩欧美视频| 国产suv精品一区二区三区88区| 国产日韩欧美自拍| 欧美日韩在线一区| 久久久久久亚洲| 久久99精品久久久久久琪琪| 久久午夜a级毛片| 色琪琪综合男人的天堂aⅴ视频| 岛国视频午夜一区免费在线观看| 美女黄色丝袜一区| 久久影院免费观看| 精品自拍视频在线观看| 久久久久久999| 久久亚洲成人精品|