SQL Server 接收任何 T-SQL 指令(查詢、批次、預存程序、觸發器、動態 SQL)後,經歷:
| 維度 | 執行計劃重用 | 重新編譯 |
|---|---|---|
| 優點 | 節省 CPU、降低阻塞、加快啟動 | 獲得最優計劃、適應數據變化 |
| 缺點 | 參數嗅探問題、計劃可能不最優 | 消耗資源、快速語句編譯佔比高 |
SQL Server 尋求平衡點,非盲目追求重用或重編譯。
-- 注意:生產環境慎用,快取可能龐大 SELECT * FROM sys.syscacheobjects;
EXEC sp_recompile 'ProcedureName'; -- 下次執行重編譯 EXEC sp_recompile 'TableName'; -- 所有引用該表的 SP 重編譯
實例級清空:
DBCC FREEPROCCACHERECONFIGUREALTER DATABASE ... COLLATE資料庫級清空:
DBCC FLUSHPROCINDB(dbid) (SQL 2000)ALTER DATABASE ... MODIFY NAME / SET ONLINE / OFFLINE / EMERGENCYDROP DATABASEDBCC CHECKDB 完成以下選項改變會導致既有計劃失效:
ANSI_NULL_DFLT_OFF, ANSI_NULL_DFLT_ON, ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, DATEFIRST, DATEFORMAT, FORCEPLAN, LANGUAGE, NO_BROWSETABLE, NUMERIC_ROUNDABORT, QUOTED_IDENTIFIER
原因:這些選項影響語義行為與結果正確性。
UPDATE STATISTICSOPTION (RECOMPILE)、OPTIMIZE FOR、區域變數緩解理解編譯/重編譯機制有助於診斷效能抖動、計劃失效等疑難雜症。核心原則:重用為主,必要時重編譯,透過穩定的環境設定減少非預期重編譯。