資源描述:
《sqlserver執(zhí)行計劃緩存(1)》由會員上傳分享,免費在線閱讀,更多相關內容在學術論文-天天文庫。
1、SQLServer執(zhí)行計劃纟爰存(1)概述了解執(zhí)行計劃對數據庫性能分析很重要,其中涉及到了語句性能分析與存儲,這也是寫這篇文章的目的,在了解執(zhí)行計劃之前先要了解一些基礎知識,所以文章前面會講一些概念,學起來會比較枯燥,但是這些基礎知識非常重要。基礎概念SQLServer有一個用于存儲執(zhí)行計劃和數據緩沖區(qū)的內存池。池內分配給執(zhí)行計劃或數據緩沖區(qū)的百分比隨系統(tǒng)狀態(tài)動態(tài)波動。內存池中用于存儲執(zhí)行計劃的部分稱為過程緩存。SQLServer執(zhí)行計劃包含下列主要組件:查詢計劃執(zhí)行計劃的主體是一個重入的只讀數據結構,可由任意數
2、量的用戶使用。這稱為查詢計劃。查詢計劃中不存儲用戶上下文。內存中查詢計劃副本永遠不超過兩個:一個副本用于所有的串行執(zhí)行,另一個用于所有的并行執(zhí)行。并行副本覆蓋所有的并行執(zhí)行,與并行執(zhí)行的并行度無關執(zhí)行上下文每個正在執(zhí)行查詢的用戶都有一個包含其執(zhí)行專用數據(如參數值)的數據結構。此數據結構稱為執(zhí)行上下文。執(zhí)行上下文數據結構可以重新使用。如果用戶執(zhí)行查詢而其中的一個結構未使用,將會用新用戶的上下文重新初始化該結構。怎樣緩存執(zhí)行計劃SQLServer有一個高效的算法,可查找用于任何特定SQL語句的現有執(zhí)行計劃。在SQL
3、Server中執(zhí)行任何SQL語句時,關系引擎將首先查看過程緩存中是否有用于同一SQL語句的現有執(zhí)行計劃。SQLServer將重新使用找到的任何現有計劃,從而節(jié)省重新編譯SQL語句的開銷。如果沒有現有執(zhí)行計劃,SQLServer將為查詢生成新的執(zhí)行計劃SQLServer自動刪除執(zhí)行計劃什么情況下會刪除執(zhí)行計劃在沒有人工手動清除緩存的情況下,如果出現內存不足的情況下SQLServer會自動清除一部分沒被利用到的緩存計劃。所有緩存的最大大小取決于maxservermemory的大小怎樣判斷需要刪除的執(zhí)行計劃如果存在內存
4、不足的情況,數據庫引擎將使用基于開銷的方法來確定從過程緩存中刪除哪些執(zhí)行計劃。怎樣確定一個執(zhí)行計劃的開銷呢,對于一個第一次執(zhí)行的執(zhí)行計劃3QLServer將它的開銷值設為0,被多次執(zhí)行過的執(zhí)行計劃SQLServer將它的開銷值設置為原始編譯開銷,所以數據庫引擎會重復檢查每個執(zhí)行計劃的狀態(tài)并將刪除當前開銷為零的執(zhí)行計劃。如果存在內存不足的情況,當前開銷為零的執(zhí)行計劃不會自動被刪除,而只有在數據庫引擎檢查該執(zhí)行計劃并發(fā)現其當前開銷為零時,才會刪除該計劃。當檢查執(zhí)行計劃時,如果當前沒有查詢使用該計劃,則數據庫引擎將降低
5、當前開銷以將其推向零。數據庫引擎會重復檢查執(zhí)行計劃,直至刪除了足夠多的執(zhí)行計劃,以滿足內存需求為止。如果存在內存不足的情況,執(zhí)行計劃可多次對其開銷進行增加或降低。如果內存不足的情況己經消失,數據庫引擎將不再降低未使用執(zhí)行計劃的當前開銷,并且所有執(zhí)行計劃都將保留在過程緩存中,即使其開銷為零也是如此。重新編譯執(zhí)行計劃根據數據庫新狀態(tài)的不同,數據庫中的某些更改可能導致執(zhí)行計劃效率降低或無效。SQLServer將檢測到使執(zhí)行計劃無效的更改,并將計劃標記為無效。此后,必須為執(zhí)行查詢的下一個連接重新編譯新的計劃。導致計劃無效
6、的情況包括:對查詢所引用的表或視圖進行更改(ALTERTABLE和ALTERVIEW)0對執(zhí)行計劃所使用的任何索引進行更改。對執(zhí)行計劃所使用的統(tǒng)計信息進行更新,這些更新可能是從語句(如UPDATESTATISTICS)中顯式生成,也可能是自動生成的。刪除執(zhí)行計劃所使用的索引。顯式調用sp_recompile。對鍵的大量更改(其他用戶對由查詢引用的表使用INSERT或DELETE語句所產生的修改)。對于帶觸發(fā)器的表,插入的或刪除的表內的行數顯著增長使用WITHRECOMPILE選項執(zhí)行存儲過程測試1.緩存的每一個對
7、象返回一行,包括緩存計劃的類型、緩存引用的對象、緩存計劃占用的空間、被使用次數、以及創(chuàng)建時間等SELECT^FROMsys.syscacheobjects;一2.緩存的每個查詢計劃返回一行,包括執(zhí)行計劃被使用的次數、執(zhí)行計劃的大小、內存地址、執(zhí)行計劃的類型、語句等SELECT^FROMsys.dm_exec_cached_plansGO3.返回由指定的sql_handle標識的SQL批處理的文本/*其中sql_handle來自:sys.dmexec_query_statssys.dm_exec_requestss
8、ys.dm_exec_cursorssys.dm_exec_xml_handlessys.dm_execquerymemory_grantssys.dm_exec_connectionsplanhandle來自:sys.dm_exec_cached_plans*/SELECT氺FROMsys.dm_exec_sql_text(sql_handle
9、planhandie);