我有兩個SQL查詢,每個約2-3個INNER JOIN。我需要在他們之間做一個INTERSECT。選項重新編譯可以快速查詢 - 好還是壞?
問題是,單獨查詢的工作很快,但交叉後總共花費約4秒。
現在,如果我在此整個查詢的末尾放置一個OPTION(RECOMPILE),查詢將很快恢復正常,幾乎可以立即返回!
我明白,選項recopile強制重建執行計劃,所以我現在很困惑,如果我的earler查詢花費4秒更好,或者現在重新編譯,但花費0秒更好。
我有兩個SQL查詢,每個約2-3個INNER JOIN。我需要在他們之間做一個INTERSECT。選項重新編譯可以快速查詢 - 好還是壞?
問題是,單獨查詢的工作很快,但交叉後總共花費約4秒。
現在,如果我在此整個查詢的末尾放置一個OPTION(RECOMPILE),查詢將很快恢復正常,幾乎可以立即返回!
我明白,選項recopile強制重建執行計劃,所以我現在很困惑,如果我的earler查詢花費4秒更好,或者現在重新編譯,但花費0秒更好。
WITH RECOMPILE指定SQL Server不緩存此存儲過程的計劃, 存儲過程在每次執行時都會重新編譯。
無論何時存儲過程第一次在SQL Server中運行,它都經過優化,查詢計劃被編譯並緩存在SQL Server的內存中。每次在緩存後運行相同的存儲過程時,它都將使用相同的查詢計劃,從而無需每次運行時都優化和編譯相同的存儲過程。因此,如果您需要每天運行相同的存儲過程1000次,則可以節省大量時間和硬件資源,並且SQL Server不必非常努力。
您不應該使用此選項,因爲通過使用此選項,通過將SQL查詢替換爲存儲過程,您失去了大部分優點。
但對於OP,避免此選項意味着SQL服務器不再100-200倍的查詢被執行,每次花費大概浪費了大量的CPU和磁盤的吞吐量,因爲它總是使用錯誤的查詢計劃。除非有辦法弄清楚如何讓SQL Server緩存一個好的計劃,那麼`OPTION(RECOMPILE)`要好得多,因爲與壞計劃的執行時間相比,計劃生成/優化時間是微觀的... – binki 2014-10-14 20:00:34
它是否定期執行?如果沒有,我不知道如何管理我的數據庫中的索引...有關如何避免需要定期執行此命令的任何想法?或者如果這是不可能的,你是否定期執行此操作的最佳方式,我的意思是不需要應用程序來執行此操作? – 2012-10-27 01:14:20