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

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

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

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

簡介

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

為什么需要執(zhí)行計劃緩存

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

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

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

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

上面三個步驟完成之后,才會生成多個候選執(zhí)行計劃。雖然我們的SQL語句邏輯上只有一個,但是符合這個邏輯順序的物理獲取數(shù)據(jù)的順序卻可以有多條,打個比方,你希望從北京到上海,即可以做高鐵,也可以做飛機,但從北京到上海這個描述是邏輯描述,具體怎么實現(xiàn)路徑有多條。那讓我們再看一個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,結(jié)果都是一樣的,因此可以生成多個執(zhí)行計劃,但一個基本原則是SQL Server不一定會選擇最好的執(zhí)行計劃,而是選擇足夠好的計劃,這是由于評估所有的執(zhí)行計劃的成本所消耗的成本不應(yīng)該過大。最終,SQL Server會根據(jù)數(shù)據(jù)的基數(shù)和每一步所消耗的CPU和IO的成本來評估執(zhí)行計劃的成本,所以執(zhí)行計劃的選擇重度依賴于統(tǒng)計信息,關(guān)于統(tǒng)計信息的相關(guān)內(nèi)容,我就不細說了。

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

執(zhí)行計劃所緩存的對象

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

編譯后的計劃:編譯的執(zhí)行計劃和執(zhí)行計劃的關(guān)系就和MSIL和C#的關(guān)系一樣。

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

游標:存儲的游標狀態(tài)類似于執(zhí)行上下文和編譯的計劃的關(guān)系。游標本身只能被某個連接使用,但游標關(guān)聯(lián)的執(zhí)行計劃可以被多個用戶共享。

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

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

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

圖1.被緩存的執(zhí)行計劃

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

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

圖2.在內(nèi)存中這幾類對象緩存所占用的內(nèi)存

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

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

被緩存的執(zhí)行計劃所存儲的內(nèi)容非常豐富,不僅僅包括被緩存的執(zhí)行計劃、語句,還包括被緩存執(zhí)行計劃的統(tǒng)計信息,比如說CPU的使用、等待時間等。但這里值得注意的是,這里的統(tǒng)計只算執(zhí)行時間,而不算編譯時間。比如說我們可以利用代碼清單2中的代碼根據(jù)被緩存的執(zhí)行計劃找到數(shù)據(jù)庫中耗時最長的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.通過執(zhí)行計劃緩存找到數(shù)據(jù)庫總耗時最長的20個查詢語句

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

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

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

執(zhí)行計劃緩存和查詢優(yōu)化器的矛盾

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

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

圖3.僅僅是由于不同的參數(shù),查詢優(yōu)化器選擇不同的執(zhí)行計劃

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

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

圖4.不同的參數(shù),卻是完全一樣的執(zhí)行計劃! 

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

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

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

圖5.執(zhí)行計劃完全變了

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

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

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

小結(jié)

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

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



注:相關(guān)教程知識閱讀請移步到MSSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产成人香蕉在线视频fuz| 麻豆天美蜜桃91| 欧美 日韩 中文字幕| 成人h动漫精品一区二区器材| 国产在线精品一区在线观看麻豆| 白浆视频在线观看| 亚洲欧洲中文天堂| 五月伊人六月| 欧美成人一区二区三区片免费| 色网站在线视频| 欧美在线高清| 韩国av电影在线观看| 欧美成年人视频网站欧美| 五月天色网站| 午夜免费电影一区在线观看| 特大黑人巨人吊xxxx| 高清国语自产拍免费视频国产| 国产激情99| 午夜伦理一区二区| 久久久久久久香蕉网| 亚洲国产精品久久久| 欧美在线性爱视频| 国内视频自拍在线视频| 亚洲欧美综合久久久久久v动漫| 成人精品视频一区二区三区| 日本十八禁视频无遮挡| 国产精品入口免费视频一| 日韩在线xxx| 亚洲欧美一区二区三区四区五区| 色哟哟精品观看| 丝袜美腿亚洲一区| 欧美黄页在线免费观看| 亚洲蜜臀av乱码久久精品| 男生草女生视频| 久久久亚洲一区| 成人高潮片免费视频| 日本一区二区视频在线观看| 亚洲国产高清国产精品| 免费看日本一区二区| 亚洲嫩模很污视频| 国产精品久久久久久久久久新婚| 99久久夜色精品国产亚洲96| 在线亚洲自拍| 欧美人与性动交α欧美精品济南到| 免费国产在线精品一区二区三区| 欧美日韩亚洲系列| 欧美一二区在线观看| 精品国产一区二区三区香蕉沈先生| 日本一区二区电影| 亚洲精品在线观看91| 91嫩草国产丨精品入口麻豆| 亚洲欧美精品在线观看| 欧美一级做一级爱a做片性| 日韩免费高清av| 日本精品一区二区三区在线播放| 欧美日韩午夜影院| 一区二区三区中文字幕在线观看| 亚洲欧洲日夜超级视频| 精品国产av色一区二区深夜久久| 一区二区三区视频网站| 国产精品久久久久aaaa| 伊人久久久久久久久久| 国产精品入口免费视频一| 亚洲影视一区二区三区| 在线成人综合色一区| 91夜夜揉人人捏人人添红杏| 精品国产乱码久久久久久虫虫漫画| 亚洲国产精品久久艾草纯爱| 欧美老女人在线| 国内精品嫩模av私拍在线观看| 亚洲精品国产一区二区在线| 国产精品偷伦免费视频观看的| 成人在线观看黄色| 亚洲欧美在线观看| 性亚洲最疯狂xxxx高清| 99精品视频99| 久久久久久成人精品| 国产精品日韩精品| 国产三级精品在线| 午夜一区在线观看| 精品免费二区三区三区高中清不卡| 性生交大片免费看l| 狠狠久久亚洲欧美专区| 放荡的美妇在线播放| 日韩电影大全免费观看2023年上| 在线播放亚洲一区| 天天av天天翘天天综合网色鬼国产| 天天色天天上天天操| 97精品国产露脸对白| 狠狠躁夜夜躁人人爽天天高潮| 最近中文字幕在线视频| 国产999精品| 亚洲熟妇无码乱子av电影| www.亚洲国产| 久久精品国产第一区二区三区最新章节| 天天夜夜亚洲| 天天操夜夜操av| 久久精品99久久香蕉国产色戒| 久久久国产精品成人免费| 亚洲国产第一| 国精产品一品二品国精品69xx| 国产成人av电影在线播放| 视频三区在线观看| 中文乱码字幕高清在线观看| 91小视频免费观看| 日韩久久精品一区二区三区| 中文字幕一区二区三区四区视频| 五月天av网站| 一本一道久久a久久精品综合| 欧美与欧洲交xxxx免费观看| 99久久综合色| 中文字幕欧美日韩| 一卡二卡三卡日韩欧美| 亚洲精品乱码久久久久久蜜桃图片| 国产老妇伦国产熟女老妇视频| 国产精品久久久久久久久久三级| 亚洲欧美高清在线| 欧美 日韩 国产 在线| 俄罗斯xxxx性全过程| 久草视频视频在线播放| 麻豆国产91在线播放| 自拍偷拍欧美亚洲| 激情六月婷婷综合| 亚洲xxxx天美| 精品72久久久久中文字幕| 欧美成人精品1314www| 国产一区二区不卡在线| 国偷自产av一区二区三区小尤奈| 亚洲一区二区免费看| 日本人体一区二区| 欧美写真视频网站| 麻豆av在线免费观看| 精品国产一区二区三区久久久狼| 人成免费电影一二三区在线观看| 精品极品三级久久久久| 国产又黄又粗的视频| 日韩av免费大片| 精品av综合导航| 国产精品久久久久久超碰| 羞羞视频在线观看一区二区| 日韩黄色av| 久久综合九色综合欧美亚洲| 精品一区二区三区蜜桃| 二区三区不卡不卡视频| 久久久国产视频91| 免费大片黄在线观看视频网站| 国产亚洲一区二区三区在线观看| 超碰人人人人人人人| 日韩成人短视频| 欧美精品免费播放| 久久99精品久久久水蜜桃| 成人在线视频免费观看| 日本一区二区三区精品| 国产农村妇女精品一二区| 亚洲视频1区2区| 91黄色免费视频| 日韩av日韩在线观看| 污黄网站在线观看| 欧美亚洲国产成人精品| 中文字幕日韩av综合精品| 麻豆精品av| 日韩专区一卡二卡| 国产高清精品软件丝瓜软件| 国产一区2区在线观看| 免费在线视频一级不卡| 久久久久无码国产精品一区| 久久久精品在线| 国产成人精品一区二区免费视频| 51vv免费精品视频一区二区| 视频一区二区不卡| 国产成人精品一区二区三区在线观看| 国产激情久久久| 天天射天天综合网| 最近国语视频在线观看免费播放| 国产在线|日韩| 国产亚洲成av人片在线观黄桃| 色欧美88888久久久久久影院| 欧美视频在线视频| 黄色a级三级三级三级| 久久av一区二区三| 日韩欧美色综合| 亚洲欧美日韩直播| 久久综合狠狠| 最新在线观看av| 精品一区二区三区在线观看视频| 久久久亚洲精品一区二区三区| 7878成人国产在线观看| 欧美精品第一区| 亚洲福利专区| 日韩三级电影免费观看| 欧美黄色成人| 国产成人亚洲综合a∨婷婷图片| 国产亚洲永久域名| 欧美网站在线| 久久免费公开视频| 久久久美女视频| 深夜视频在线免费| 国产91在线视频观看| 中文字幕一区二区三区精品| 亚洲一区二区三区在线播放| 在线观看成人黄色| 最近中文字幕在线中文视频| 国产高清在线免费观看| 国产成人精品免费看视频| fc2成人免费人成在线观看播放| 精品magnet| 国产精品欧美日韩一区二区| 欧美伦理视频在线观看| 久久精品无码专区| 亚洲精品影院在线| 日本欧美在线视频免费观看| 911亚洲精选| 久久久久久久久99精品大| 欧美乱大交xxxxxbbb| 亚洲国产欧美日韩另类综合| 天天躁日日躁狠狠躁欧美巨大小说| 在线观看日本一区| 男人的天堂va在线| 国产18无套直看片| xfplay精品久久| 美女少妇精品视频| 欧美一级特黄aaa| 乱小说欧美综合| 女生裸体视频一区二区三区| 日本不卡影院| 欧美日韩免费在线视频| 国产精品天美传媒沈樵| 久久97精品| 欧美极品日韩| 日本丰满少妇裸体自慰| 日韩欧美在线123| 亚洲精品乱码久久久久久久久久久久| 日本黄色小说视频| 50一60岁老妇女毛片| 日本不卡视频在线| 国产综合福利在线| 成人1区2区| 三级中文字幕在线观看| **三级三级97片毛片| 欧美激情精品久久久六区热门| 蜜臀久久久久久999| 丝袜诱惑一区二区| 五月天最新网址| 严阵以待中文社区| 在线观看免费视频国产| 国产精品中文字幕欧美| 国产精品 欧美 日韩| 久久久久久一区二区三区四区别墅| 欧洲亚洲一区二区三区四区五区| 国产不卡网站| 国产一区二区精品久久99| 中文字幕中文字幕在线十八区| 欧美精品18| 欧美自拍视频在线| 护士精品一区二区三区| 中文字幕伦av一区二区邻居| 色综合天天综合网天天狠天天| 国产乱码精品一区二区三区中文| 久久精品无码中文字幕| 中文字幕久久亚洲| 曰批又黄又爽免费视频| 久久久久久久久久久久久国产精品| 亚洲欧美中文日韩v在线观看| 在线观看av网站永久| www.av黄色| 亚洲国产日韩欧美在线| 成人黄色在线网站| 996久久国产精品线观看| 国产一区二区三区视频在线观看| 91一区一区三区| 一区二区三区视频网| 国产精品久久久久一区二区| 粉嫩av蜜桃av蜜臀av| 无码人妻aⅴ一区二区三区| 亚洲一级淫片| 涩涩视频网站在线观看| 国产精品网站在线观看| 最近中文字幕在线mv视频在线| 国产99久久九九精品无码免费| 在线不卡免费视频| 精品一区二区中文字幕| 日本特黄一级片| 精品亚洲欧美一区| 日本福利视频在线| 欧洲精品亚洲精品| av在线不卡网站| 色多多在线观看| 亚洲私拍视频| 一区 二区 三区| 日本免费网址| 99在线精品视频免费观看软件| 日韩经典在线观看| 国产精品果冻传媒潘| 久久久精品综合| 国产嫩bbwbbw高潮| 国产三级av片| 国产一区二区在线视频聊天| 日本一区二区在线| 久久人人爽人人爽人人片av高清| 日韩综合另类| 91看片一区| 国产又粗又猛又爽又黄的视频小说| 亚洲高清国产精品| 色婷婷777777仙踪林| 国产乱色精品成人免费视频| 中文字幕在线日亚洲9| 91探花福利精品国产自产在线| 无线免费在线视频| av午夜精品一区二区三区| 成年人深夜福利| 一级肉体全黄裸片| 欧美精品一区二区三区中文字幕| 国产成人亚洲综合a∨婷婷图片| 97超碰最新| 69堂视频在线观看国产| 毛片中文字幕| 免费观看国产精品| 青青草视频在线免费直播| 久久久久北条麻妃免费看| 精品在线视频免费观看| 国产成人精品视频免费| 青青视频在线免费观看| 日本一区二区三区在线观看| 最近2019中文字幕大全第二页| 欧美日韩卡一卡二| 狠狠色噜噜狠狠狠8888米奇| 狠狠操第一页| 日本午夜精品理论片a级app发布|