程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server 2005 中的批編譯、重新編譯和計劃緩存問題(1)

SQL Server 2005 中的批編譯、重新編譯和計劃緩存問題(1)

編輯:關於SqlServer

一、本白皮書的目的

此白皮書的目的有幾個。闡述了批處理在 SQL Server 2005 中的緩存和重用方式,並就最大限度重用已緩存的計劃提供了相應的最佳實務。另外,文中還說明了一些重新編譯批處理的方案,並針對減少或消除不必要的重新編譯,給出了最佳實務。本白皮書闡述了 SQL Server 2005 的“語句級重新編譯”功能。另外,還介紹了許多工具及實用程序,它們可在查詢編譯、查詢重新編譯、計劃緩存和計劃重用過程中充當很有用的觀測工具。我們在整篇文章中對比了 SQL Server 2000 和 SQL Server 2005 的不同表現,以便讀者能夠更好地了解文中的內容。本文檔所列舉的語句均適用於 SQL Server 2000 SQL Server 2005。同時,明確指出了這兩個 SQL Server 版本在行為上的差異。

本文面向三類讀者:

用戶:使用、維護並為 SQL Server 開發應用程序的人員。初識 SQL Server 2005 的用戶及正從 SQL Server 2000 進行遷移的人員將在這裡找到有用的信息。

開發人員:SQL Server 開發人員將在這裡找到有用的背景信息。

測試人員和項目經理:本文檔將對“SQL Server 2005 中的編譯和重新編譯”功能提供說明。

二、重新編譯:定義

在查詢、批處理、存儲過程、觸發器、被准備語句或動態 SQL 語句(以下稱為“批處理”)在 SQL Server 上開始執行以前,批處理將被編譯成計劃。然後,將執行該計劃以便發揮其效力或生成結果。

一個批處理可包含一個或多個 SELECT、INSERT、UPDATE 和 DELETE 語句、存儲過程調用(T-SQL“粘連”或控制結構(比如:SET、IF、WHILE、DECLARE)可能使其產生交錯)、DDL 語句(比如:CREATE、DROP)以及與權限相關的語句(比如:GRANT、DENY 和 REVOKE)。批處理還可包含 CLR 構造的定義和用法(比如:用戶定義的類型、函數、過程和聚合)。

已編譯的計劃被保存到 SQL Server 的一部分內存中,這部分內存稱為計劃緩存。將搜索計劃緩存以獲得重用計劃的機會。如果對某個批處理重用計劃,就可避免編譯工作。請注意,在有關 SQL Server 的文獻中,過去所用的“過程緩存”一詞在本文中被稱為“計劃緩存”。“計劃緩存”用詞更准確,因為計劃緩存不僅僅保存存儲過程的查詢計劃。

在涉及 SQL Server 的用語中,上段所提到的編譯過程有時會被誤認為是“重新編譯”,但該過程僅涉及“編譯”。

重新編譯的定義:假設某個批處理被編譯成一個或多個查詢計劃的集合。在 SQL Server 開始執行任何單獨的查詢計劃之前,服務器將檢查該查詢計劃的有效性(正確性)和最優性。如果某個檢查失敗了,將重新編譯相應查詢計劃所對應的語句或整個批處理,並可能生成一個不同的查詢計劃。這種編譯稱為“重新編譯”。

請特別注意,不必預先緩存該批處理的查詢計劃。實際上,某些批處理類型從不被緩存,但仍能引發重新編譯。舉個例,有個批處理包含一個大於 8 KB 的文本。假設該批處理創建了一個臨時表,並在表中插入了 20 行。所插入的第七行將導致重新編譯,但由於其包含的文本較大,將不緩存該批處理。

在 SQL Server 中執行的多數重新編譯都是有根據的。有些是為了確保語句的正確性;另一些是為了在 SQL Server 數據庫中的數據發生變化時,獲得最佳的查詢執行計劃。然而,重新編譯有時會大大延緩批處理執行的速度。這時,就有必要減少進行重新編譯的次數。

三、比較 SQL Server 2000 和 SQL Server 2005 中的重新編譯

在 SQL Server 2000 中重新編譯批處理時,將重新編譯批處理中的所有語句,而不僅僅是觸發重新編譯的語句。SQL Server 2005 在該行為上做了改進,只編譯導致重新編譯的語句,而不是整個批處理。與 SQL Server 2000 相比,這一“語句級重新編譯”功能將改善 SQL Server 2005 的重新編譯行為。尤其,在批處理重新編譯過程中,SQL Server 2005 所用的 CPU 時間和內存更少,而得到的編譯塊也更少。

語句級重新編譯有一個優點顯而易見:不必再只是為了減少較長的存儲過程的重新編譯罰點,而將其分成多個較短的存儲過程。

>>>更多專題請看SQL Server SQL Server故障 SQL Server
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved