有時內嵌 SQL(動態 SQL)執行速度反而快於存儲過程,這違背了「存儲過程預編譯、計劃復用」的常規認知。
存儲過程執行緩慢的常見原因是**頻繁重編譯**,導致無法復用執行計劃。需通過性能測試確認:
SHOWPLAN 輸出Cache Hit Ratio / Cache Miss Ratio)在存儲過程內部引用表、視圖、預存程序時,**顯式指定擁有者(通常是 dbo)**,可顯著減少重編譯與緩存缺失:
-- 不推薦
SELECT * FROM mytable
-- 推薦:指定 dbo 擁有者
SELECT * FROM dbo.mytable
dbo. 後,計劃緩存鍵值固定,不同用戶調用可共享同一計劃COMPILE 鎖爭用,提升高併發下的吞吐量CREATE INDEX、ALTER TABLE)SET 選項異常(如 ANSI_NULLS、QUOTED_IDENTIFIER 不一致)WITH RECOMPILE 或 OPTION (RECOMPILE)sp_recompile:標記對象需重編譯SP:Recompile 事件sys.dm_exec_query_stats、sys.dm_exec_cached_plans 分析計劃復用情況存儲過程本身不保證性能優於動態 SQL,**計劃復用率**才是關鍵。規範使用 dbo. 前綴、穩定 SET 選項、避免臨時表 DDL,是確保存儲過程高性能的基礎功夫。