Каковы примеры функций / предложений SQL Server Query, которых следует избегать? - PullRequest
4 голосов
/ 03 февраля 2010

Какие примеры функций / предложений SQL Server Query следует избегать?

Недавно я узнал, что предложение NOT IN сильно снижает производительность.

У вас есть еще примеры?

Ответы [ 4 ]

5 голосов
/ 03 февраля 2010

Причина, по которой следует избегать NOT IN, на самом деле не в производительности, а в том, что она имеет действительно удивительное поведение, когда набор содержит ноль. Например:

select 1
where 1 not in (2,null)

Это не вернет никаких строк, потому что where интерпретируется как:

where 1 <> 2 and 1 <> null

Первый 1 <> null оценивается как неизвестный. Тогда 1 <> 2 and unknown оценивается как неизвестное. Таким образом, вы не получите никаких строк.

2 голосов
/ 04 февраля 2010

Избегайте

CURSOR - использовать набор на основе операций

SELECT * - явно называть ваши столбцы

EXEC (@dynamic_sql_with_input_parms) - использовать sp_executesql с входными параметрами.

2 голосов
/ 03 февраля 2010

Я избегаю коррелированных подзапросов (некоррелированные подзапросы и производные таблицы в порядке) и любых курсоров, которых я могу избежать. Также избегайте циклов while, если можете. Думайте с точки зрения наборов данных, а не построчно.

Если вы используете UNION, проверьте, будет ли работать UNION ALL. Существует потенциальная разница в результатах, поэтому убедитесь, что вы внесли изменения.

Я всегда смотрю на слово DISTINCT как на подсказку, чтобы увидеть, есть ли лучший способ представить данные. DISTINCT обходится дороже по сравнению с использованием производной таблицы или другого метода, чтобы избежать его использования.

Избегайте синтаксиса подразумеваемого соединения, чтобы избежать случайного перекрестного соединения (которое люди часто фиксируют, вздрагивая, с отчетливым). (Создание списка из 4 миллионов записей с последующим различием, чтобы получить три нужные вам данные, является дорогостоящим.)

Избегайте взглядов, которые вызывают другие взгляды! У нас есть люди, которые спроектировали единую клиентскую базу данных таким образом, и производительность УЖАСНА! Не идите по этому пути.

Избегайте синтаксиса, например ГДЕ MyField Like "% test% '

Это и другие несохраняемые операторы where, которые могут помешать оптимизатору использовать индексы.

0 голосов
/ 03 февраля 2010

Я недавно изменил представление с

Select Row1, Row2 FROM table Where blahID = FKblahID
UNION
Select Row1, Row2 FROM table2 Where blah2ID = FKblahID

на просто

Select Row1, Row2 FROM table Where blahID = FKblahID

и увидел запрос, который выполнялся ~ 8 минут, а теперь занял ~ 20 секунд, не уверен на 100%почему такое большое изменение.

Второй союз также возвращал только около 200 записей, тогда как первый возвращал пару тысяч.

...