徵狀
當您填入包含許多資料列的資料表變數,然後將它與其他資料表加入時,查詢優化程式可能會選擇低效的查詢方案,這可能會導致查詢效能變慢。
解決方案
套用此熱修復程式後,您可以開啟追蹤標誌2453,讓資料表變數在有足夠的列數變更時觸發重新編譯。 這可讓查詢最佳化工具選擇更有效率的方案。 此問題首先是在 SQL Server 的下列累積更新或/和 Service Pack 中修正。
SQL Server 2014 累積更新3 /en-us/help/2984923
每個新的 SQL Server 累計更新都包含所有的修正程式,以及前一個累積更新中所包含的所有安全性修正程式。 查看 SQL Server 的最新累計更新:
Service pack 是累加的。 每個新的 service pack 都包含舊版 service pack 中的所有修正程式,以及任何新的修正程式。 我們建議您將最新的 service pack 和該 service pack 的最新累計更新套用。 在安裝最新的 service pack 之前,您不需要安裝舊版 service pack。 使用下列文章中的表格1,尋找最新 service pack 及最新累計更新的詳細資訊:
其他相關資訊
當您在批次或程式中使用資料表變數時,查詢會針對資料表變數的初始空白狀態進行編譯和優化。 如果這個資料表變數是在執行時間中填入許多資料列,預先編譯的查詢方案可能不再是最佳的。 例如,查詢可能會使用嵌套迴圈加入資料表變數,因為只有少量的資料列通常會更有效率。 如果資料表變數有數百萬個數據列,此查詢方案可能會造成效率低下。 在這種情況下,散列連接可能是較佳的選擇。 若要取得新的查詢方案,必須重新編譯它。 不過,與其他使用者或臨時資料表不同的是,資料表變數中的列數變更不會觸發查詢重新編譯。 通常,您可以使用選項(重新編譯)來解決這個問題,這會有自己的額外費用。Trace 標誌2453可在沒有選項(重新編譯)的情況下,獲得查詢重新編譯的好處。 此追蹤標誌與選項(重新編譯)在兩個主要方面有所不同。(1)它會使用與其他資料表相同的列數閾值。 查詢不需要針對每個執行進行編譯,就不會像是 OPTION (重新編譯)。 只有當列計數變更超出預先定義的閾值時,才會觸發重新編譯。(2)選項(重新編譯)會強制查詢預覽參數並為其優化查詢。 此追蹤標誌不會強制進行參數查看。注意: 此追蹤旗標必須在執行時間開啟。 您無法在 QUERYTRACEON 中使用此追蹤標記。 您必須小心使用此追蹤標誌,因為它可以增加查詢重新編譯的數目,這可能會比更完善的查詢優化節省成本。
狀態
Microsoft 已確認<適用於>一節所列的 Microsoft 產品確實有上述問題。