在下面的查詢中,如果患者表有1000條記錄,TableValueFunction會執行多少次?只有一次或1000次?查詢執行問題
這是一個存儲過程中的查詢,你有更好的主意來改善這個嗎?
SELECT * FROM Patients
WHERE Patient.Id In (SELECT PatientId FROM TableValueFunction(parameters..))
在下面的查詢中,如果患者表有1000條記錄,TableValueFunction會執行多少次?只有一次或1000次?查詢執行問題
這是一個存儲過程中的查詢,你有更好的主意來改善這個嗎?
SELECT * FROM Patients
WHERE Patient.Id In (SELECT PatientId FROM TableValueFunction(parameters..))
這取決於你用什麼參數。如果參數是常量,函數將執行一次,但如果參數是來自Patients
的字段,則該函數將執行與表Patients
中的行一樣多的次數。
+1謝謝!參數是常數。你能解釋一下,如果它只執行一次,它如何緩存結果?每次交易緩存? – CharithJ
@CharithJ - 有可能TVF將被用作嵌套循環連接的驅動輸入,因此它不需要緩存任何結果。每一行都會在出現在患者表中時進行處理。或者可能作爲散列連接的構建輸入如果您要將TVF加入自己,但可能會執行多次,或者您可能會在計劃中看到一個緩存來緩存結果。 –
從某種程度上講,這取決於您是在討論一個內聯TVF還是一個多語句框架。
多語句TVF對查詢優化器是完全不透明的。它總是假定它將返回1行,並且它不會擴展到主查詢中。
由於1行假設,那麼如果您的患者表在PatientId
上編入索引,則您可能會獲得與TVF的嵌套循環連接作爲驅動表,這意味着它只執行一次。
如果它沒有編入索引並且您得到散列或合併連接,則這兩個方法都只處理兩次輸入。
內聯TVF被合併到查詢中。所以這個函數本身不會像這樣執行。但是,SQL Server然後可以引用基數信息,並且可以對計劃進行排序,使得包含在TVF中的查詢出現在嵌套循環連接的內部並且具有大於1的執行次數。
+1感謝您的解釋,它是一個Inline TVF。所以希望只執行一次... – CharithJ
我很確定它只會執行一次。不過,我建議你使用SQL Server Management Studio中的「show execution plan」選項進行檢查。不知道TableValueFunction是什麼,我們無法真正告訴你是否有更好的方法。 –
您是在談論多語句TVF還是內聯TVF? –
@ Martin:這是一個內聯TVF。 – CharithJ