2009-09-16 23 views
3

我剛剛在SQLServer 2000的表值函數中包裝了一個複雜的SQL語句。 查看SELECT * FROM dbo.NewFunc的查詢計劃時,它只是給了我創建的表的表掃描。表值函數我的查詢計劃去了哪裏?

我猜這是因爲表是在tempdb中創建的,我只是從中選擇。

所以查詢很簡單:

SELECT * FROM table in tempdb 

我的問題是:

是使用相同的計劃,複雜的SQL語句中的UDF?

我該如何調整這個UDF的索引?

我可以看到真實的計劃嗎?

+0

您可以通過至少運行一次函數然後查看緩存來查看查詢計劃,例如:https://dba.stackexchange.com/a/198524/18190 – binki 2018-02-22 00:05:22

回答

6

多語句表值函數(TVF)是外部查詢的優化器的黑色框。你只能從profiler中看到IO,CPU等。

TVF必須運行完成並在發生任何處理之前返回所有行。這意味着where子句不會被優化。

所以,如果這個TVF返回一百萬行,它已經排序第一。

SELECT TOP 1 x FROM db.MyTVF ORDER BY x DESC 

單一聲明/內聯TVF不會因爲它們像宏一樣擴展而被評估。上面的例子將評價指標等

而且,這裏太:Does query plan optimizer works well with joined/filtered table-valued functions?Relative Efficiency of JOIN vs APPLY in Microsoft SQL Server 2008

要確切地回答:沒有,沒有,沒有

我已經很少多語句TVFs:這裏我做什麼,我有很多參數要在UDF內進行過濾。