這到底是什麼dbo.func()
嗎?是否有可能將100個值插入到表結構中,並且一次對100個集合執行該操作,而不是1x1 100次?
舉個例子,假設你有這樣的功能,只是把一個逗號分隔的浮點值列表變爲單列表:
CREATE FUNCTION dbo.ListFloats
(
@List VARCHAR(MAX)
)
RETURNS TABLE
RETURN
(
SELECT i = CONVERT(FLOAT, Item)
FROM
(
SELECT Item = x.i.value('(./text())[1]', 'FLOAT')
FROM
(
SELECT [XML] = CONVERT(XML, '<i>'
+ REPLACE(@List, ',', '</i><i>')
+ '</i>').query('.')
) AS a
CROSS APPLY
[XML].nodes('i') AS x(i)
) AS y
WHERE Item IS NOT NULL
);
GO
現在你應該能得到您的花車在一組只是簡單地說:
SELECT i FROM dbo.ListFloats('1.5, 3.0, 2.45, 1.9');
採取更進了一步,讓我們說dbo.func()
需要這兩個輸入,說是這樣的:
RETURN (SELECT (@param1 + @param2/@param2));
現在,我知道你總是被告知模塊化和封裝是好的,但是在內聯函數的情況下,我建議你避免獲得這個結果的函數(同樣你沒有解釋什麼是dbo.func()
,所以我只是猜測這會很容易),並進行內聯。因此,而不是調用dbo.func()
的 - 兩次,每次行,沒少 - 你可以說:
DECLARE
@Param1Array VARCHAR(MAX) = '1.5, 3.0, 2.45, 1.9',
@Param2 FLOAT = 2.0;
WITH x AS
(
SELECT t.point, x.i, fValue = ((x.i + t.point)/t.point)
FROM dbo.[table] AS t
CROSS JOIN dbo.ListFloats(@Param1Array) AS x
)
SELECT point, i, fValue FROM x
--WHERE fValue < @Param2
;
的關鍵是:
避免單獨處理每個參數。
避免在單獨的模塊中關閉個別計算。
儘可能少地執行計算。
如果你不能改變結構這麼多,那麼最起碼,避免計算功能兩次通過寫來代替:
;WITH x AS
(
SELECT *, dbo.func(@param1, a.point) as fValue
FROM dbo.table AS a
)
SELECT * FROM x
WHERE fValue < @param2;
如果你提供有關數據類型的詳細信息,有什麼dbo.func()
呢,等等,人們將能夠提供更多切實的建議。
謝謝!這正是我需要的! –