2011-08-31 100 views
2

在下面的查詢中,如果患者表有1000條記錄,TableValueFunction會執行多少次?只有一次或1000次?查詢執行問題

這是一個存儲過程中的查詢,你有更好的主意來改善這個嗎?

SELECT * FROM Patients 
WHERE Patient.Id In (SELECT PatientId FROM TableValueFunction(parameters..)) 
+3

我很確定它只會執行一次。不過,我建議你使用SQL Server Management Studio中的「show execution plan」選項進行檢查。不知道TableValueFunction是什麼,我們無法真正告訴你是否有更好的方法。 –

+0

您是在談論多語句TVF還是內聯TVF? –

+0

@ Martin:這是一個內聯TVF。 – CharithJ

回答

4

這取決於你用什麼參數。如果參數是常量,函數將執行一次,但如果參數是來自Patients的字段,則該函數將執行與表Patients中的行一樣多的次數。

+0

+1謝謝!參數是常數。你能解釋一下,如果它只執行一次,它如何緩存結果?每次交易緩存? – CharithJ

+0

@CharithJ - 有可能TVF將被用作嵌套循環連接的驅動輸入,因此它不需要緩存任何結果。每一行都會在出現在患者表中時進行處理。或者可能作爲散列連接的構建輸入如果您要將TVF加入自己,但可能會執行多次,或者您可能會在計劃中看到一個緩存來緩存結果。 –

1

從某種程度上講,這取決於您是在討論一個內聯TVF還是一個多語句框架。

多語句TVF對查詢優化器是完全不透明的。它總是假定它將返回1行,並且它不會擴展到主查詢中。

由於1行假設,那麼如果您的患者表在PatientId上編入索引,則您可能會獲得與TVF的嵌套循環連接作爲驅動表,這意味着它只執行一次。

如果它沒有編入索引並且您得到散列或合併連接,則這兩個方法都只處理兩次輸入。

內聯TVF被合併到查詢中。所以這個函數本身不會像這樣執行。但是,SQL Server然後可以引用基數信息,並且可以對計劃進行排序,使得包含在TVF中的查詢出現在嵌套循環連接的內部並且具有大於1的執行次數。

+0

+1感謝您的解釋,它是一個Inline TVF。所以希望只執行一次... – CharithJ