sqlserver 删除字段_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 選項執行存儲過程。
測試
執行計劃相關系統視圖
手動清空緩存執行計劃
測試索引更改對執行計劃的影響
使用Profiler監控
使用SQL:StmtRecompile監控,如果是監控存儲過程則使用:SP:Recompile
修改索引
在索引中添加字段
再執行查詢
SELECT NAME FROM TPlan
測試增加字段對執行計劃的影響增加查詢非相關字段
ALTER TABLE [dbo].[TPlan] ADD Number INT
刪除查詢有關的索引也同樣會導致執行計劃重編譯,這里就不截圖貼出來了。 查看執行計劃
SELECT Cacheobjtype,objtype,dbid,objid,usecounts,pagesused,sql FROM sys.syscacheobjects WHERE DBID=DB_ID()
執行計劃中顯示了該執行計劃被調用了兩次,在隨機叢書中寫的是會重新編譯新的執行計劃,如果是這樣的話那這里的值應該是1才對。
猜測:SQL Server在架構更改的時候通過檢測執行計劃已經對原先的執行計劃進行了編譯,所以在新的查詢中還是使用了第一次查詢的執行計劃。
如果有誰知道結果麻煩告知。
總結
以上是生活随笔為你收集整理的sqlserver 删除字段_SQL Server 执行计划缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql+显示表ddl_MySQL_D
- 下一篇: failed to open mysql