1

好吧,這個聽起來可能是一個noob問題,但是SQL並不是我真正的強項,所以我在這裏請求一些幫助。Table-Valued函數(SQL)是否在每次調用時創建表? [性能]

我想實現一些東西,但是我擔心性能問題。

我想解決的問題是這樣的:

我有很多逗號分離數據列「」 事情是這樣的:數據1,數據2,數據3,data57

我需要的是循環瀏覽每條數據用逗號分隔所有的記錄,然後然後用這個單一的東西做點什麼數據,你明白了嗎?

我發現一個解決方案,can actually help me,但我擔心繫統性能,因爲我可能需要使用不同的參數多次調用這個函數!

在我對Table-Valued函數(UDF)進行的每次調用中創建表還是sql server將它保存爲緩存? [也許我寧願需要一個臨時桌子?]

謝謝你的幫助提前!


注:的數據是不是我的,我應該使用它原樣,所以建議更改數據庫是毫無疑問的(但我知道這將是最好的情況)。 a 注2:這個問題的目的是將初始數據導入到數據庫中,由於性能可能不會運行很多次,所以性能可能並不是一個嚴重的問題,但我仍然要考慮這個問題,我能做的最好的方式!

+1

是的。該函數將在'tempdb'中創建一個條目並填充它,然後在每次調用中處理它。 – TZHX

+0

Alllrighhht ...感謝您的評論!請寫一個適當的答案,我會很樂意接受它:) – TiagoM

+0

順便說一句,如果你可以提供更好的解決方案來解決這個問題,請成爲我的客人,我將不勝感激:) – TiagoM

回答

2

用戶定義的由多個語句組成的表值函數(如您找到的那樣)將在系統數據庫中創建一個對象,並填充該對象,然後在對象超出作用域時對其進行處置。

如果你想在相同的參數上多次運行這個,你可以考慮創建一個表變量並緩存你自己的結果。如果你打算用逗號分隔的值在不同的列表上調用它,那麼避免這種開銷並不是一個好方法。 SQL Server並不是真正爲大量的字符串操作而構建的。

通常,對於一次性作業,此tempdb用法的性能影響不會成爲您的主要擔憂。它更關心的是它在數據庫生活中的常見模式。

如果可以的話,我會建議您在適當大小的數據子集上測試解決方案的性能。

既然你說你的SQL Server 2016上,您可以利用新的STRING_SPLIT功能,像

SELECT t.Column1, t.Column2, s.value 
FROM table t 
CROSS APPLY STRING_SPLIT(t.CsvColumn, ',') s 

可能讓你靠近你想去的地方,而不需要定義一個新的功能。請注意,您的數據庫需要在2016年兼容級別(130)下運行才能使用,只需在SQL 2016上運行是不夠的(它們通常會使用新功能執行此操作,以避免發生向後兼容性風險 - 中斷更改)。

+0

感謝您的回答,我試圖運行該查詢來檢查結果,但它到目前爲止工作不正常,它說「無效的對象名'STRING_SPLIT'」。此外,我不得不改變擦除s.value,因爲's'不代表任何表,也許這是一個錯字,你的意思是?謝謝 ! – TiagoM

+1

好的,所以我打算把s作爲別名添加到STRING_SPLIT返回的表中;但它聽起來像你沒有那個。你可以檢查數據庫的兼容性級別嗎?它可能會設置爲2014(120)或2012(110),除非您可以更改它,否則將使STRING_SPLIT不可用。 – TZHX

+0

我剛剛從谷歌注意到,我需要運行這個命令:「ALTER DATABASE TestAzureDB SET COMPATIBILITY_LEVEL = 130」 – TiagoM

相關問題