Оптимизация в запросе

Александр Злобин
Дата: 13.04.2010 12:00:18
В статьях по оптимизации нашел вот такой пример:

SELECT substring(',' + @param + ',', Number + 1,
charindex(',', ',' + @param + ',', Number + 1) - Number - 1)
AS Value
FROM Numbers
WHERE Number <= len(',' + @param + ',') - 1
AND substring(',' + @param + ',', Number, 1) = ','

Не надо вникать в суть этого запроса...
У меня возник вот какой вопрос: Действительно ли оптимально будет четыре раза повторять выражение

',' + @param + ','

или все же оптимальней будет объявить переменную, вычислить выражение один раз и затем использовать его:

declare @str nvarchar(500)

set @str = ',' + @usedWords + ','

SELECT substring(@str, Number + 1,
charindex(',', @str, Number + 1) - Number - 1)
AS Value
FROM Numbers
WHERE Number <= len(@str) - 1
AND substring(@str, Number, 1) = ','

или я слишком загоняюсь по оптимальности и тут не будет вообще никакой разницы по скорости работы?
ShSerge
Дата: 13.04.2010 12:16:10
Александр Злобин
Не надо вникать в суть этого запроса...

А Вы вникните. :)
Оптимизация - не та. Хотя, то, что Вы написали про объявление переменной - правильно, но не в смысле "оптимизации", а в смысле программирования. Гораздо (во много раз) хуже то, что во вхере (WHERE) используются выражения. Они вычисляются (!) каждый раз для каждой записи таблицы Numbers. Например,
...WHERE Number <= len(@str) - 1
хуже во много раз, чем
DECLARE @ls int SET @ls=len(@str) - 1
...WHERE Number <= @ls
Яростный Меч
Дата: 13.04.2010 12:22:54
ShSerge
Гораздо (во много раз) хуже то, что во вхере (WHERE) используются выражения. Они вычисляются (!) каждый раз для каждой записи таблицы Numbers.
Сильно сомневаюсь, что в современных СУБД так бывает. План выполнения ведь не как попало строится. Думаю, такую ерунду там точно предусмотрели.
Яростный Меч
Дата: 13.04.2010 12:24:10
Вычисляться каждый раз будут только те выражения, в которых участвуют столбцы.
Яростный Меч
Дата: 13.04.2010 12:27:03
А вообще, на стоимости запроса влияют операции ввода-вывода, join, order by, group by...

А сабжевые вычисления - 1% в худшем случае, на них заморачиваемся в последнюю очередь.
ShSerge
Дата: 13.04.2010 12:33:34
Яростный Меч
ShSerge
Гораздо (во много раз) хуже то, что во вхере (WHERE) используются выражения. Они вычисляются (!) каждый раз для каждой записи таблицы Numbers.
Сильно сомневаюсь, что в современных СУБД так бывает. План выполнения ведь не как попало строится. Думаю, такую ерунду там точно предусмотрели.

Случается и такое. Встречался. Но, в общем, понятное дело, план запроса надо смотреть. Насчёт параметров, да - фигня.