1

我有一個非常複雜的表值函數在各種表上進行內部連接。我必須調整這個功能。 SQL不會顯示在函數內執行的實際執行計劃。所以我想將其轉換爲存儲過程並查看查詢計劃。當我在單個批處理中運行原始函數以及這個新的存儲過程時,存儲過程佔用了100%的時間。轉換爲存儲過程時表值函數運行緩慢

這是預期嗎?我正在使用SQL Server 2008.

+0

這真的取決於SQL是否能夠有效地緩存計劃,是否從冷點運行? –

+0

是的。我剛剛創建了proc,接下來我將兩個人一起執行。如何製作SQL緩存計劃? – Ankush

+0

(如果您先運行SP,是否表值函數能夠重新使用來自SP的緩存結果並因此佔用0%?) – marnir

回答

2

是的,這是預期的。多語句表值函數(TVF)是一個黑盒子,內部處理不可見。

它沒有運行(以及可能是因爲其他原因,但這不是問題)。優化程序無法正確判斷TVF與程序,因此將100%的批次分配給proc。

一種方法是運行代碼(separatley)並使用SQL Profiler來記錄Duration,Reads,CPU。

+0

我後來在這個TVF上創建了另一個SP(稱爲這個SP2和第一個SP1),然後分批運行。 SP2仍然快了100%。爲什麼這樣? – Ankush

+0

由於TVF仍然是一個黑匣子,無論是否包裝在SP中 – gbn

+0

謝謝......將使用SQL分析器。 – Ankush