我有一個相對複雜的查詢,有幾個自連接,它可以在一個相當大的表上工作。 爲了使查詢更快地執行,我只需要使用數據的一個子集。 根據傳遞的參數,數據的所述子集可以在12000和120000行之間。SQL Server多語句UDF - 臨時存儲數據的方式
更多細節可以在這裏找到:SQL Server CTE referred in self joins slow
正如你所看到的,我使用的是CTE之前返回數據子集,這引起了一些性能問題與SQL Server進行重新運行在Select語句CTE用於每個連接,而不是僅僅運行一次並重用其數據集。
使用臨時表的替代方法工作得更快(同時在UDF主體之外的單獨窗口中測試查詢)。 但是,當我試圖在多語句UDF中實現此功能時,SQL Server強烈提醒我說,由於某種原因,多語句UDF不支持臨時表...但是,UDF確實允許表變量,但由於某些原因,UDF不支持臨時表。所以我嘗試過,但是性能是非常糟糕的,因爲我的查詢需要1m40才能完成,而CTE版本只有需要40秒。 我相信,表變量是在這個線程上市速度慢的原因:Table variable poor performance on insert in SQL Server Stored Procedure
臨時表的版本需要大約1秒,但我不能讓它成爲一個函數由於SQL Server的限制,我有將表返回給調用者。
考慮到CTE和表變量都太慢了,臨時表在UDF中被拒絕了,我的選項是爲了讓我的UDF能夠快速執行?
非常感謝。
問題與表變量是查詢優化器的作用,雖然他們總是會返回一個行,因此會導致一些錯誤的決定。如果你知道的更好,你可以強制一個更好的計劃。你在什麼版本的SQL Server? 2005年還是2008年? – 2010-06-16 18:16:41
SQL Server 2005,謝謝。 – 2010-06-16 18:21:47