0

我寫了一個複雜的查詢,它會返回一個ID列表。現在我想重新使用這個查詢,以便將結果與另一個查詢結合起來。爲此,我計劃將其放入Stored Proc或UDF中,然後將其用於插入臨時表中。SQL Server StoredProc vs UDF內聯表

類似下面

1)把在存儲過程的查詢,並把它插入到臨時表

INSERT INTO #TEMP 
EXEC SP_COMPLEX(@PARAM1,@[email protected]@PARAMN) 

2)將查詢在UDF並將其插入到臨時表

INSERT INTO #TEMP 
SELECT ID_LIST FROM DBO.UDF_COMPLEX(@PARAM1,@[email protected]@PARAMN) 

當我運行1000個ID的結果時,我看不到兩者之間的顯着差異。但在實際實施中,結果可能是一百萬行。

對於哪一個會更好?

回答

2

而不是猜測,我建議你比較這兩種技術的執行計劃。

用戶定義的函數可以是 方便,它們也有時 原因性能受到影響。這 問題與他們是他們使用 逐行處理,類似於一個 遊標,而不是基於集合的 操作。所以如果你的查詢結果集爲 ,那麼對性能 的影響會很小。但是如果 結果集很大,那麼性能 可能會成爲問題。 一般來說,如果您使用的是 用戶定義的函數,您將希望 避免將它們與較大的結果 集合一起使用。改用存儲過程。

提高標量值用戶定義函數性能的一種方法是將它們轉換爲表值類型。

0

我發現使用內聯表值函數並直接加入它是比我在問題中提出的選項更好和更高效的選項。 喜歡的東西

SELECT MYTABLE.MYFIELD FROM MYTABLE, DBO.UDF_COMPLEX(@PARAM1,@[email protected]@PARAMN) MYQUERY 
WHERE MYTABLE.KEYVALUE = MYQUERY.KEYVALUE 
+0

下面的語法實際上是非常低效的 INSERT INTO #TEMP EXEC SP_COMPLEX(@ PARAM1,@ PARAM2 ... @@ PARAMN) – devanalyst 2009-10-06 11:33:12