自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL Server 執(zhí)行計劃緩存

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

概述

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

基礎(chǔ)概念

SQL Server 有一個用于存儲執(zhí)行計劃和數(shù)據(jù)緩沖區(qū)的內(nèi)存池。池內(nèi)分配給執(zhí)行計劃或數(shù)據(jù)緩沖區(qū)的百分比隨系統(tǒng)狀態(tài)動態(tài)波動。內(nèi)存池中用于存儲執(zhí)行計劃的部分稱為過程緩存。

SQL Server 執(zhí)行計劃包含下列主要組件:

查詢計劃

執(zhí)行計劃的主體是一個重入的只讀數(shù)據(jù)結(jié)構(gòu),可由任意數(shù)量的用戶使用。這稱為查詢計劃。查詢計劃中不存儲用戶上下文。內(nèi)存中查詢計劃副本永遠(yuǎn)不超過兩個:一個副本用于所有的串行執(zhí)行,另一個用于所有的并行執(zhí)行。并行副本覆蓋所有的并行執(zhí)行,與并行執(zhí)行的并行度無關(guān)。

執(zhí)行上下文

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

怎樣緩存執(zhí)行計劃

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

SQL Server自動刪除執(zhí)行計劃

什么情況下會刪除執(zhí)行計劃

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

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

怎樣判斷需要刪除的執(zhí)行計劃

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

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

重新編譯執(zhí)行計劃

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

  • 對查詢所引用的表或視圖進(jìn)行更改(ALTER TABLE 和 ALTER VIEW)。
  • 對執(zhí)行計劃所使用的任何索引進(jìn)行更改。
  • 對執(zhí)行計劃所使用的統(tǒng)計信息進(jìn)行更新,這些更新可能是從語句(如 UPDATE STATISTICS)中顯式生成,也可能是自動生成的。
  • 刪除執(zhí)行計劃所使用的索引。
  • 顯式調(diào)用 sp_recompile。
  • 對鍵的大量更改(其他用戶對由查詢引用的表使用 INSERT 或 DELETE 語句所產(chǎn)生的修改)。
  • 對于帶觸發(fā)器的表,插入的或刪除的表內(nèi)的行數(shù)顯著增長。
  • 使用 WITH RECOMPILE 選項執(zhí)行存儲過程。

#p#

測試

 

  1. --1.緩存的每一個對象返回一行,包括緩存計劃的類型、緩存引用的對象、緩存計劃占用的空間、被使用次數(shù)、以及創(chuàng)建時間等 
  2. SELECT * FROM sys.syscacheobjects; 
  3. --2.緩存的每個查詢計劃返回一行,包括執(zhí)行計劃被使用的次數(shù)、執(zhí)行計劃的大小、內(nèi)存地址、執(zhí)行計劃的類型、語句等 
  4. SELECT * FROM sys.dm_exec_cached_plans; 
  5. GO 
  6. ---3.返回由指定的 sql_handle 標(biāo)識的 SQL 批處理的文本 
  7. /*其中sql_handle來自: 
  8. sys.dm_exec_query_stats 
  9. sys.dm_exec_requests 
  10. sys.dm_exec_cursors 
  11. sys.dm_exec_xml_handles 
  12. sys.dm_exec_query_memory_grants 
  13. sys.dm_exec_connections 
  14. plan_handle來自:sys.dm_exec_cached_plans 
  15. */  
  16. SELECT * FROM sys.dm_exec_sql_text(sql_handle | plan_handle); 
  17. GO 
  18. --4.以 XML 格式返回計劃句柄指定的批查詢的顯示計劃,主要接受來自sys.dm_exec_cached_plans的plan_handle句柄 
  19. SELECT * FROM sys.dm_exec_query_plan(plan_handle); 
  20. GO 
  21. --5.每個計劃屬性返回一行,主要接受來自sys.dm_exec_cached_plans的plan_handle句柄 
  22. SELECT * FROM sys.dm_exec_plan_attributes(plan_handle); 
  23. GO 
  24. --6.針對每個 Transact-SQL 執(zhí)行計劃、公共語言運(yùn)行時 (CLR) 執(zhí)行計劃和與計劃關(guān)聯(lián)的游標(biāo)返回一行,,主要接受來自sys.dm_exec_cached_plans的plan_handle句柄 
  25. SELECT * FROM sys.dm_exec_cached_plan_dependent_objects(plan_handle); 
  26.  
  27. --7.返回緩存查詢計劃的聚合性能統(tǒng)計信息。緩存計劃中的每個查詢語句在該視圖中對應(yīng)一行,并且行的生存期與計劃本身相關(guān)聯(lián)。在從緩存刪除計劃時,也將從該視圖中刪除對應(yīng)行。*/ 
  28. --該系統(tǒng)視圖針對每一個緩存中的執(zhí)行計劃統(tǒng)計其執(zhí)行時間、物理、邏輯操作等信息 
  29. SELECT * FROM sys.dm_exec_query_stats 

 

 

手動清空緩存執(zhí)行計劃

  1. ---清空制定數(shù)據(jù)庫執(zhí)行計劃 
  2. DECLARE @DBID INT 
  3. SET @DBID=DB_ID() 
  4. DBCC FLUSHPROCINDB(@DBID); 
  5. GO 
  6.  
  7. ---創(chuàng)建測試數(shù)據(jù)庫 
  8. CREATE TABLE TPlan 
  9. (ID INT PRIMARY KEY IDENTITY(1,1), 
  10. Name NVARCHAR(20) NOT NULL
  11. Istate INT NOT NULL
  12. Idate DATETIME DEFAULT(GETDATE()) 
  13. GO 
  14. ---創(chuàng)建索引 
  15. CREATE INDEX IX_TPlan_NAME ON TPlan 
  16. (Name 
  17. GO 
  18. INSERT INTO TPlan(Name,Istate) 
  19. VALUES('1',1),('2',2),('3',3) 
  20.  
  21. GO 
  22. SELECT NAME FROM TPlan 
  23. GO 
  24. SELECT Cacheobjtype,objtype,dbid,objid,usecounts,pagesused,sql FROM sys.syscacheobjects 
  25. WHERE DBID=DB_ID() 

使用Profiler監(jiān)控

使用SQL:StmtRecompile監(jiān)控,如果是監(jiān)控存儲過程則使用:SP:Recompile

 

修改索引

在索引中添加字段

  1. DROP INDEX [IX_TPlan_NAME] ON [dbo].[TPlan] WITH ( ONLINE = OFF ) 
  2. GO 
  3. USE [Study] 
  4. GO 
  5. CREATE NONCLUSTERED INDEX [IX_TPlan_NAME] ON [dbo].[TPlan]  
  6.     [NameASC 
  7. 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
  8. GO 

 

再執(zhí)行查詢

  1. SELECT NAME FROM TPlan 

SQL Server 執(zhí)行計劃緩存

測試增加字段對執(zhí)行計劃的影響

增加查詢非相關(guān)字段

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

SQL Server 執(zhí)行計劃緩存

刪除查詢有關(guān)的索引也同樣會導(dǎo)致執(zhí)行計劃重編譯,這里就不截圖貼出來了。

查看執(zhí)行計劃

  1. SELECT Cacheobjtype,objtype,dbid,objid,usecounts,pagesused,sql FROM sys.syscacheobjects 
  2.  
  3. WHERE DBID=DB_ID() 

執(zhí)行計劃中顯示了該執(zhí)行計劃被調(diào)用了兩次,在隨機(jī)叢書中寫的是會重新編譯新的執(zhí)行計劃,如果是這樣的話那這里的值應(yīng)該是1才對。

 

SQL Server 執(zhí)行計劃緩存

猜測:SQL Server在架構(gòu)更改的時候通過檢測執(zhí)行計劃已經(jīng)對原先的執(zhí)行計劃進(jìn)行了編譯,所以在新的查詢中還是使用了***次查詢的執(zhí)行計劃。

博文地址:http://www.cnblogs.com/chenmh/archive/2015/04/20/4438086.html
 

責(zé)任編輯:Ophira 來源: cnblogs
相關(guān)推薦

2011-09-14 17:03:17

數(shù)據(jù)庫執(zhí)行計劃解析

2014-08-28 09:54:35

SQL Server

2009-11-18 17:05:47

捕獲Oracle SQ

2011-08-18 09:19:19

SQL Server的SQL查詢優(yōu)化

2010-11-10 11:32:17

sql server計

2010-11-04 14:25:19

DB2 SQL文執(zhí)行計

2024-06-12 09:23:37

2021-03-17 09:35:51

MySQL數(shù)據(jù)庫explain

2023-09-21 10:55:51

MysqlSQL語句

2021-05-28 10:46:36

MySQL執(zhí)行計劃

2011-09-13 15:39:00

SQL Server性能調(diào)優(yōu)

2010-11-04 14:35:38

DB2 sql文執(zhí)行計

2021-12-13 22:15:29

SQLOracle共享池

2022-08-08 08:03:44

MySQL數(shù)據(jù)庫CBO

2009-11-13 16:28:02

Oracle生成執(zhí)行計

2024-09-12 15:16:14

2010-04-16 09:27:18

Ocacle執(zhí)行計劃

2022-08-15 15:09:26

SQL數(shù)據(jù)庫MySQL

2020-09-15 08:44:57

MySQL慢日志SQL

2021-02-20 08:40:19

HiveExplain底層
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號