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

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

SQL Server 執行計劃緩存

2024-08-31 00:54:37
字體:
來源:轉載
供稿:網友
SQL Server 執行計劃緩存

標簽:SQL SERVER/MSSQL SERVER/數據庫/DBA/內存池/緩沖區

概述

了解執行計劃對數據庫性能分析很重要,其中涉及到了語句性能分析與存儲,這也是寫這篇文章的目的,在了解執行計劃之前先要了解一些基礎知識,所以文章前面會講一些概念,學起來會比較枯燥,但是這些基礎知識非常重要。

目錄

  • 概述
  • 基礎概念
    • 怎樣緩存執行計劃
    • SQL Server自動刪除執行計劃
    • 重新編譯執行計劃
  • 測試
    • 執行計劃相關系統視圖
    • 手動清空緩存執行計劃
    • 測試索引更改對執行計劃的影響
    • 測試增加字段對執行計劃的影響
  • 總結
基礎概念

SQL Server 有一個用于存儲執行計劃和數據緩沖區的內存池。池內分配給執行計劃或數據緩沖區的百分比隨系統狀態動態波動。內存池中用于存儲執行計劃的部分稱為過程緩存。

SQL Server 執行計劃包含下列主要組件:

  • 查詢計劃

執行計劃的主體是一個重入的只讀數據結構,可由任意數量的用戶使用。這稱為查詢計劃。查詢計劃中不存儲用戶上下文。內存中查詢計劃副本永遠不超過兩個:一個副本用于所有的串行執行,另一個用于所有的并行執行。并行副本覆蓋所有的并行執行,與并行執行的并行度無關。

  • 執行上下文

每個正在執行查詢的用戶都有一個包含其執行專用數據(如參數值)的數據結構。此數據結構稱為執行上下文。執行上下文數據結構可以重新使用。如果用戶執行查詢而其中的一個結構未使用,將會用新用戶的上下文重新初始化該結構。

怎樣緩存執行計劃

SQL Server 有一個高效的算法,可查找用于任何特定 SQL 語句的現有執行計劃。在 SQL Server 中執行任何 SQL 語句時,關系引擎將首先查看過程緩存中是否有用于同一 SQL 語句的現有執行計劃。SQL Server 將重新使用找到的任何現有計劃,從而節省重新編譯 SQL 語句的開銷。如果沒有現有執行計劃,SQL Server 將為查詢生成新的執行計劃。

SQL Server自動刪除執行計劃

什么情況下會刪除執行計劃

在沒有人工手動清除緩存的情況下,如果出現內存不足的情況下SQL Server會自動清除一部分沒被利用到的緩存計劃。

所有緩存的最大大小取決于max server memory的大小。

怎樣判斷需要刪除的執行計劃

果存在內存不足的情況,數據庫引擎將使用基于開銷的方法來確定從過程緩存中刪除哪些執行計劃。怎樣確定一個執行計劃的開銷呢,對于一個第一次執行的執行計劃SQL Server將它的開銷值設為0,被多次執行過的執行計劃SQL Server將它的開銷值設置為原始編譯開銷,所以數據庫引擎會重復檢查每個執行計劃的狀態并將刪除當前開銷為零的執行計劃。如果存在內存不足的情況,當前開銷為零的執行計劃不會自動被刪除,而只有在數據庫引擎檢查該執行計劃并發現其當前開銷為零時,才會刪除該計劃。當檢查執行計劃時,如果當前沒有查詢使用該計劃,則數據庫引擎將降低當前開銷以將其推向零。

數據庫引擎會重復檢查執行計劃,直至刪除了足夠多的執行計劃,以滿足內存需求為止。如果存在內存不足的情況,執行計劃可多次對其開銷進行增加或降低。如果內存不足的情況已經消失,數據庫引擎將不再降低未使用執行計劃的當前開銷,并且所有執行計劃都將保留在過程緩存中,即使其開銷為零也是如此。

重新編譯執行計劃

根據數據庫新狀態的不同,數據庫中的某些更改可能導致執行計劃效率降低或無效。SQL Server 將檢測到使執行計劃無效的更改,并將計劃標記為無效。此后,必須為執行查詢的下一個連接重新編譯新的計劃。導致計劃無效的情況包括:

  • 對查詢所引用的表或視圖進行更改(ALTER TABLE 和 ALTER VIEW)。
  • 對執行計劃所使用的任何索引進行更改。
  • 對執行計劃所使用的統計信息進行更新,這些更新可能是從語句(如 UPDATE STATISTICS)中顯式生成,也可能是自動生成的。
  • 刪除執行計劃所使用的索引。
  • 顯式調用 sp_recompile。
  • 對鍵的大量更改(其他用戶對由查詢引用的表使用 INSERT 或 DELETE 語句所產生的修改)。
  • 對于帶觸發器的表,插入的刪除的表內的行數顯著增長。
  • 使用 WITH RECOMPILE 選項執行存儲過程。
測試執行計劃相關系統視圖
--1.緩存的每一個對象返回一行,包括緩存計劃的類型、緩存引用的對象、緩存計劃占用的空間、被使用次數、以及創建時間等SELECT * FROM sys.syscacheobjects;--2.緩存的每個查詢計劃返回一行,包括執行計劃被使用的次數、執行計劃的大小、內存地址、執行計劃的類型、語句等SELECT * FROM sys.dm_exec_cached_plans;GO---3.返回由指定的 sql_handle 標識的 SQL 批處理的文本/*其中sql_handle來自:sys.dm_exec_query_statssys.dm_exec_requestssys.dm_exec_cursorssys.dm_exec_xml_handlessys.dm_exec_query_memory_grantssys.dm_exec_connectionsplan_handle來自:sys.dm_exec_cached_plans*/ SELECT * FROM sys.dm_exec_sql_text(sql_handle | plan_handle);GO--4.以 XML 格式返回計劃句柄指定的批查詢的顯示計劃,主要接受來自sys.dm_exec_cached_plans的plan_handle句柄SELECT * FROM sys.dm_exec_query_plan(plan_handle);GO--5.每個計劃屬性返回一行,主要接受來自sys.dm_exec_cached_plans的plan_handle句柄SELECT * FROM sys.dm_exec_plan_attributes(plan_handle);GO--6.針對每個 Transact-SQL 執行計劃、公共語言運行時 (CLR) 執行計劃和與計劃關聯的游標返回一行,,主要接受來自sys.dm_exec_cached_plans的plan_handle句柄SELECT * FROM sys.dm_exec_cached_plan_dependent_objects(plan_handle);--7.返回緩存查詢計劃的聚合性能統計信息。緩存計劃中的每個查詢語句在該視圖中對應一行,并且行的生存期與計劃本身相關聯。在從緩存刪除計劃時,也將從該視圖中刪除對應行。*/--該系統視圖針對每一個緩存中的執行計劃統計其執行時間、物理、邏輯操作等信息SELECT * FROM sys.dm_exec_query_stats 
手動清空緩存執行計劃
--清空緩存中的執行計劃DBCC FREEPROCCACHE; -- ( plan_handle | sql_handle | pool_name )GO-- 清空制定數據庫的執行計劃DBCC FLUSHPROCINDB(<dbid>);GO---清空緩存中的數據DBCC DROPCLEANBUFFERS;---清空特定緩存存儲區中的執行計劃DBCC FREESYSTEMCACHE(<cachestore>) -- 'ALL', pool_name, 'Object Plans', 'SQL Plans', 'Bound Trees'GO
測試索引更改對執行計劃的影響
---清空制定數據庫執行計劃DECLARE @DBID INTSET @DBID=DB_ID()DBCC FLUSHPROCINDB(@DBID);GO---創建測試數據庫CREATE TABLE TPlan(ID INT PRIMARY KEY IDENTITY(1,1),Name NVARCHAR(20) NOT NULL,Istate INT NOT NULL,Idate DATETIME DEFAULT(GETDATE()))GO---創建索引CREATE INDEX IX_TPlan_NAME ON TPlan(Name)GOINSERT INTO TPlan(Name,Istate)VALUES('1',1),('2',2),('3',3)GOSELECT NAME FROM TPlanGOSELECT Cacheobjtype,objtype,dbid,objid,usecounts,pagesused,sql FROM sys.syscacheobjectsWHERE DBID=DB_ID()

使用Profiler監控

使用SQL:StmtRecompile監控,如果是監控存儲過程則使用:SP:Recompile

修改索引

在索引中添加字段

DROP INDEX [IX_TPlan_NAME] ON [dbo].[TPlan] WITH ( ONLINE = OFF )GOUSE [Study]GOCREATE NONCLUSTERED INDEX [IX_TPlan_NAME] ON [dbo].[TPlan] (    [Name] ASC)INCLUDE ( [Istate]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]GO

再執行查詢

SELECT NAME FROM TPlan

測試增加字段對執行計劃的影響

增加查詢非相關字段

ALTER TABLE [dbo].[TPlan] ADD Number INT

刪除查詢有關的索引也同樣會導致執行計劃重編譯,這里就不截圖貼出來了。

查看執行計劃

SELECT Cacheobjtype,objtype,dbid,objid,usecounts,pagesused,sql FROM sys.syscacheobjectsWHERE DBID=DB_ID()

執行計劃中顯示了該執行計劃被調用了兩次,在隨機叢書中寫的是會重新編譯新的執行計劃,如果是這樣的話那這里的值應該是1才對。

猜測:SQL Server在架構更改的時候通過檢測執行計劃已經對原先的執行計劃進行了編譯,所以在新的查詢中還是使用了第一次查詢的執行計劃。

如果有誰知道結果麻煩告知。

總結

如果文章對大家有幫助,幫忙推薦,謝謝!?。?/strong>

備注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。

《歡迎交流討論》


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧亚中文在线| 日韩麻豆第一页| 91在线视频免费| 91久久在线观看| 91在线视频免费| 国产成人精品视频在线观看| 国产99视频精品免视看7| 2020久久国产精品| 欧美中文字幕在线观看| 国产精品偷伦视频免费观看国产| 久久夜色精品亚洲噜噜国产mv| 国产欧美最新羞羞视频在线观看| 国产精品高潮视频| 成人网中文字幕| 色综合伊人色综合网| 青青精品视频播放| 91精品久久久久久久久久入口| 国产欧美精品日韩精品| 精品亚洲国产视频| 国产欧美精品日韩| 韩日精品中文字幕| 亚洲一区www| 国产亚洲人成网站在线观看| 国产免费一区二区三区在线观看| 亚洲人成网站999久久久综合| 一区二区日韩精品| 欧美大成色www永久网站婷| 国产日韩在线看| 狠狠色狠狠色综合日日小说| 欧美激情一二三| 午夜精品福利视频| 国产精品丝袜白浆摸在线| 国产精品一区二区三区毛片淫片| 日本成人在线视频网址| 中文字幕精品一区二区精品| 久久天天躁日日躁| 91沈先生在线观看| 国产原创欧美精品| 日本aⅴ大伊香蕉精品视频| 精品日本美女福利在线观看| 成人中文字幕+乱码+中文字幕| 日韩一区二区三区xxxx| 精品国产一区av| 九九九热精品免费视频观看网站| 精品无人国产偷自产在线| 日韩av在线高清| 亚洲图片欧美日产| 亚洲国产精品小视频| 国产精品电影网| 97香蕉超级碰碰久久免费的优势| 欧洲s码亚洲m码精品一区| 91精品国产91久久久久久最新| 91人人爽人人爽人人精88v| 国产97在线播放| 久久久久久久久久久久av| 黑人精品xxx一区一二区| 久久躁日日躁aaaaxxxx| 成人精品久久一区二区三区| 中文字幕亚洲欧美一区二区三区| 日韩视频免费大全中文字幕| 欧美视频一二三| 国产精品a久久久久久| 欧美色另类天堂2015| 一区二区亚洲欧洲国产日韩| 97香蕉超级碰碰久久免费的优势| 欧洲成人在线视频| 亚洲一区久久久| 夜色77av精品影院| 国产精自产拍久久久久久蜜| 2021国产精品视频| 韩国欧美亚洲国产| 91超碰caoporn97人人| 美女av一区二区| 日韩最新免费不卡| 美女性感视频久久久| 国产亚洲免费的视频看| 亚洲天堂男人天堂女人天堂| 成人www视频在线观看| 韩国v欧美v日本v亚洲| 日韩在线激情视频| 欧美一级大片在线观看| 日韩欧美亚洲一二三区| 久久全球大尺度高清视频| 亚洲精品美女久久久久| 欧美激情国产高清| 亚洲天堂免费观看| 亚洲最大在线视频| 97国产在线观看| 成人网页在线免费观看| 欧美精品在线看| 欧美电影免费观看| 欧美人成在线视频| 日韩有码在线观看| 亚洲美女激情视频| 亚洲一区二区中文字幕| 久久久久久久久久国产精品| 亚洲成人av片在线观看| 国产精品扒开腿做| 国自产精品手机在线观看视频| 91av福利视频| 国产ts人妖一区二区三区| 91九色蝌蚪国产| 97国产精品免费视频| 疯狂做受xxxx欧美肥白少妇| 自拍偷拍亚洲一区| 97免费视频在线| 精品丝袜一区二区三区| 91精品国产九九九久久久亚洲| 国产成人一区二区| 精品视频在线导航| 国产精品欧美日韩| 日本精品久久电影| 久久久久久久久久久久av| 亚洲国产精彩中文乱码av在线播放| 欧美日韩国产二区| 日韩精品在线免费观看视频| 成人久久18免费网站图片| 国产午夜精品全部视频在线播放| 国产99久久精品一区二区永久免费| 欧美高清第一页| **欧美日韩vr在线| 日韩有码片在线观看| 亚洲免费一在线| 91九色视频在线| 国产黑人绿帽在线第一区| 欧美精品福利视频| 中文字幕欧美日韩精品| 精品女厕一区二区三区| 欧美天堂在线观看| 在线不卡国产精品| 91网站在线免费观看| 日韩精品极品在线观看播放免费视频| 久久久久日韩精品久久久男男| 日韩av不卡电影| 国产欧美精品一区二区三区-老狼| 国产精品高清在线观看| 亚洲欧美成人一区二区在线电影| 日韩欧美主播在线| 91精品免费视频| 国产深夜精品福利| 亚洲成人教育av| 亚洲最大的网站| 亚洲中国色老太| 一本一本久久a久久精品综合小说| 在线播放国产一区中文字幕剧情欧美| 国产精品igao视频| 国产精品美乳在线观看| 欧美亚洲国产日本| 国产ts人妖一区二区三区| 最近2019中文字幕mv免费看| 国产精品久久久久久久av大片| 国外日韩电影在线观看| 亚洲一区制服诱惑| 8090成年在线看片午夜| 欧日韩不卡在线视频| 最近的2019中文字幕免费一页| 狠狠色狠狠色综合日日五| 国产日韩av在线播放| 国产一区二区三区欧美| 亚洲精品国产综合久久| 亚洲欧美制服综合另类| 亚洲色图在线观看| 欧美国产激情18| 亚洲国产日韩欧美在线99|