首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

淺析 SQL Server 2000 中 T-SQL 的解析、編譯與執行流程

     編輯:關於SqlServer

T-SQL (Transact-SQL) 是微軟在 Sybase 基礎上擴展的結構化查詢語言,並非獨立程式語言,必須經由 SQL Server 資料引擎解析、編譯、執行。理解這三大階段的運作機制,有助於撰寫高效率程式碼並善用執行計畫快取。

三大核心階段

  1. 解析:命令解析器檢查語法,將原始碼拆解為關鍵字、識別碼、運算子等邏輯單元,構建內部結構。查詢批次生成 查詢樹,程序批次生成 循序樹。
  2. 編譯:查詢優化器評估資源存取成本 (I/O、CPU、記憶體),嘗試尋找最小資源方案,產出包含安全檢查、約束驗證、觸發器等任務清單的 執行計畫。
  3. 執行:執行元件依計畫在快取中運行,各步驟分派至關係引擎組件 (DML、DDL、預存程序、交易、工具管理器) 處理,結果集回傳呼叫端。

圖一:SQL Server 關係引擎架構示意 (左側為解析/編譯/優化,右側為執行組件)

執行計畫快取與重用機制

編譯完成的執行計畫駐留於程序快取。後續相同請求優先尋找匹配計畫,命中則直接執行,否則重新解析編譯。快取管理由 惰性寫入器 負責:每個計畫擁有「編譯成本因子」(視複雜度賦值),每次被引用「年齡」遞增該因子;惰性寫入器定期掃描將年齡遞減,歸零則回收記憶體。記憶體壓力大時亦會淘汰低成本計畫。

簡易查詢與預存程序計畫重用差異

簡易查詢 (Ad-hoc) 重用條件極嚴

  1. 查詢文本必須與快取計畫 完全相同 (含空白、換行、大小寫)。
  2. 必須使用 完整限定名稱 (如 SELECT * FROM PUBS.DBO.SALES)。

因此 SELECT * 因文本固定較易重用,而 SELECT col1, col2... 因欄位列表常異而難重用。

預存程序計畫重用優勢顯著

  • 預存程序首次執行前解析編譯,後續直接重用計畫,避免重複編譯開銷。
  • 計畫分兩部分:可重入部分 (多使用者共享) 與 執行上下文 (含參數值等會話專屬資料)。

導致計畫失效與重新編譯的操作

  • 資料量顯著變更、建立/刪除索引、新增/修改約束、更新索引統計資料。
  • 手動呼叫 sp_recompile 或 sp_compile (針對資料表,可批量重編譯引用該表的所有程序/觸發器)。

最佳實務:重建索引或更新統計後,務必重新編譯相關預存程序;生產環境最穩妥的方式是重啟 MSSQLSERVER 服務 (或執行 DBCC FREEPROCCACHE),確保所有計畫刷新。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved