程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 淺談SQL SERVER2000T-SQL的運行

淺談SQL SERVER2000T-SQL的運行

編輯:關於SqlServer


  T-SQL(Trantsact-SQL)是微軟公司在Sybase的基礎上發展起來的一種結構化查詢語言,是應用程序和存儲過程與SQL SERVER通訊和訪問的工具.包涵了ANSI89和ANSI92標准.所以T-SQL不是一種標准的編程語言,它必須通過SQL SERVER的數據引擎來分析和運行,SQL Server是如何編譯和運行T-SQL語句呢?

  SQL Server在處理任何T-SQL語句時都經過下面三個步驟:

  1.解析T-SQL語句

  2.編譯T-SQL語句

  3.執行T-SQL語句

  當一個T-SQL的批處理提交到SQL Server服務器,服務器回將這個T-SQL批處理作為一個整體進行分析,再優化,編譯,最後再分步執行.

  一. 解析

  所謂”解析”是指SQL Server命令解析模塊首先檢查T-SQL批處理語法的過程,如果沒有找到錯誤,命令解析器將源代碼細分為多個邏輯單元,比如:關鍵字,標識符以及運算符.然後命令解析器會構建一個內部結構,最後通過這個內部結構生成DDL操作或DDM操作所需要的詳細的步驟.如果該T-SQL批處理包涵一個查詢,那麼這個內部結構被成為查詢樹(QUERY TREE),如果該T-SQL批處理是一個過程,那麼這個內部查詢被成為順序樹(SEQUENCE TREE).

圖一:SQL Server的關系引擎部分

  大家可以看出在圖一的左邊,主要是T-SQL的解析,編譯和查詢優化(Query Optimizer).這是SQL Server運行T-SQL非常關鍵的部分.在圖的右邊是執行組件,當T-SQL語句編譯過後就會直接傳給執行結構進行運行.在中間的部分是SQL管理器,控制整個T-SQL批處理的解析,編譯和執行. SQL Message 是從客戶端接受的(TDS)數據.Express Services Libary是進行數據轉換,過慮數據和進行計算和統計,同時也會格式化輸出的數據.



  二.編譯

  這一步主要是將順序樹(SEQUENCE TREE)生成為一個執行規劃, 查詢優化器(Query Optimizer)主要是對T-SQL語句所要檢索的資源進行評估,生成I/O的時間,過慮時間和其他邏輯處理的時間.然後查詢優化器(Query Optimizer)是試圖利用一個最小資源的方案.

  這個方案中還包括執行是需要的任務列表(比如:安全檢查,約束檢查,觸發器檢查等等).這個就被成為執行規劃

  三.執行

  執行組件根據執行規劃在高速緩存中運行並滯留,執行規劃的不同步驟將被發送到關系引擎的不同組件進行處理:DML管理器,DDL管理器,存儲過程管理器,事務處理管理器和實用工具管理器.處理結果將以結果集的方式被收集合並返回調用者.

  執行規劃將在高速緩存中被保留一段時間,如果同一用戶或其他用戶發出類似請求的T-SQL批處理,關系數據引擎將會優先在高速緩存中尋找匹配的執行規劃.如果該執行規劃存在就采用運行,如果不存在,SQL Server 就會解析並編譯這個T-SQL批處理.

  如果SQL SERVER需要的內存不夠,它會從內存中刪除一些執行規劃。SQL Server有一個很好的”老化”算法,它可以統計某個執行規劃的使用時間和次數.如果內存足夠的大,也可以無限的增加執行規劃到內存中.

  四. 簡單查詢執行規劃的重用

  簡單T-SQL批處理只可以在2中情況下被重用:

  1. 第二次查詢的文本必須和高速緩存中執行規劃所描述的文本完全相同,每一項都要匹配,包括:空格,換行,縮排,在大小寫敏感的SQL Server中還包括字符的大小寫.

  2. 查詢包涵完全修飾的數據庫對象以便重用執行規劃.

  select * FORM PUBS.DBO.SALES

  所以在這種情況下:”*” 的執行效率要高於select COLUMN_LIST FROM TABLENAME的語句.

  五.存儲過程執行規劃的重用:

  存儲過程比簡單查詢執行效率高的一個主要原因是:存儲過程的執行規劃可以方便的被重用.比圖:在執行一個簡單查詢3次,那麼SQL Server需要執行3次解析—編譯—執行的過程,而存儲過程最有可能的是在第一次執行之前被解析並被重新編譯一次.

  存儲過程的執行規劃分2部分:

  1.可重入部分,可以被人員數量的存儲過程同時使用;

  2.包括數據上下文的部分,也就是執行期間存儲過程的各個參數;

  在SQL SERVER中有一個組件--惰性寫入器(LAZYWRITER),來判斷緩存中的執行規劃是否會重用和是否需要申請更多的內存.如果有下列的操作,SQL Server將立即重緩存中刪除執行規劃,釋放內存:

  明顯改變數據量;

  創建和刪除INDEX;

  添加和更改約束;

  更改INDEX的分布信息;

  顯示的調用sp_recompile以重新編譯存儲過程或觸發器;

  當SQL Server建立一個執行規劃就會給該執行規劃一個”編譯成本因子”.這個成本因子的值取決於創建該執行規劃所需要的資源開銷.例如:賦予一個大型的執行規劃的編譯成本因子是8,而一個小的執行規劃的編譯成本因子是2.每次某個CLIENT引用該執行規劃,他的”年齡”就會遞增一個編譯成本因子的值.

  SQL SERVER的惰性寫入器(LAZYWRITER)是如何工作的呢? SQL SERVER的惰性寫入器用來降低執行規劃的”年齡”, 惰性寫入器進程會定期循環遍歷高速緩存中的所有執行規劃,並將執行規劃的”年齡”減1,當執行規劃的編譯成本因子的值為0時,SQL Server就會收回分配給該執行規劃的內存.

  備注:

  SQL SERVER的優化組件(Query Optimizer)會在存儲過程引用的表數據更新時自動重新編譯該存儲過程,更新執行規劃.但在你添加一個INDEX時,SQL Server不會自動重新編譯存儲過程,需要手動刷新高速緩存的執行規劃(最簡單的方法,你可以重新啟動MSSQLSERVER服務),這是該存儲過程會被重新編譯,或者你可以手動強制重新編譯:

  exec sp_recompile sp_storedprocedurename

  SQL Server還提供了另外一種高效的重新編譯的方法:如果有大量的存儲過程和觸發器引用某一個表,並且還添加表INDEX以提高檢索的效率.這是我們可以通過重新編譯這個表來重新編譯所有的存儲過程和觸發器:

  exec sp_compile tablename.

  所有我們在重新建立索引或執行了更新索引的操作子後,一定要重新編譯存儲過程,不過這是最好的辦法是重新啟動服務器.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved