Что именно делает 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()
и т. д., люди смогут дать более осязаемый совет.