2015-02-28 2 views
0

Я тестировал затраты на использование простой функции внутри запроса, потому что я читал, что это замедляет запросы, поэтому я сделал функцию sum и протестировал ее в таблице чисел (100000 номеров). Когда я увидел результаты, я смутился, потому что я не видел никакой разницы.Функции производительности внутри запросов

У меня есть причина, по которой я не вижу прироста производительности, когда я не использую функцию ...?

Это моя функция:

create function [dbo].[calculator] 
(
    @a bigint, 
    @b bigint 
) 
returns bigint 
as 
begin 
    return @a + @b; 
end 

А вот запросы:

declare @top bigint = 100 

select 
    n.n, 
    n2.n, 
    dbo.calculator(n.n,n2.n) 
from dbo.Nums100 n 
cross join dbo.Nums100 n2 
where dbo.calculator(n.n,n2.n) < @top; 

select 
    n.n, 
    n2.n, 
    n.n+n2.n 
from dbo.Nums100 n 
cross join dbo.Nums100 n2 
where n.n + n2.n < @top; 

select 
    n.n, 
    n2.n, 
    calc.s 
from dbo.Nums100 n 
cross join dbo.Nums100 n2 
cross apply(values(dbo.calculator(n.n,n2.n)))calc(s) 
where calc.s < @top; 
+0

Почему вы ожидаете увидеть прирост производительности, используя функцию вместо поточного SQL? –

ответ

0

производительность SQL является сложным искусством очень.

Стоимость функций обычно не является самой функцией (если она не является сложной), но обычно является общим воздействием на запрос. Например, использование функции Table Valued может легко привести к потере статистики, что означает, что SQL будет плохо планировать количество возвращаемых строк. Использование скалярной функции, как опубликовано, может быть выполнено до всех фильтров, и, таким образом, может выполняться больше времени, чем необходимо (не важно в вашем примере, потому что это не сложно) Кроме того, при использовании в фильтрах или выражениях объединения они могут чтобы индексы не использовались и могут нанести ущерб в плане выполнения (иногда это приводит к сканированию таблиц). Иногда это может также вызвать потерю параллелизма, что действительно видно только в больших масштабах.

Мораль истории? Если он работает достаточно быстро для вас в вашем конкретном случае, отлично. Но не пытайтесь масштабировать или чрезмерно просто проблему и предполагать, что результаты будут непосредственно масштабироваться.

сами функции не являются проблемой, но они могут вызвать проблемы, если не использовать осторожно (как и большинство других функций SQL)

Смежные вопросы