2010-02-03 1 views
4

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

Недавно я узнал, что пункт НЕ ВХОДИТ в, что ухудшает производительность.

Есть ли еще примеры?

+0

Собственно, 'NOT IN' не обязательно так плохо; если у вас есть нужные индексы, он превращается в анти-соединение, которое работает лучше, чем версия «LEFT JOIN'-' NULL ». – Aaronaught

+1

Я слышал, что утверждение «SELECT» довольно плохое, и его следует избегать. –

+1

запрос всегда может работать быстрее, если вы добавляете - перед каждой строкой ... – corymathews

ответ

5

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

select 1 
where 1 not in (2,null) 

Это не возвращает ни одной строки, потому что where интерпретируется как:

where 1 <> 2 and 1 <> null 

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

+0

Решение: Запрет 'NULL'. По крайней мере, это то, что проповедуют некоторые мусульмане! +1. – Aaronaught

0

Недавно я изменил вид из

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 записей, а первый возвращал пару тысяч.

+0

Как избежать этой функции/статьи? –

+0

@OMG Ponies: Очевидно, вы не слышали о новой новой функции, которая позволяет вам сгруппировать кучу утверждений 'UNION' вместе вместо изменения условия' WHERE' по простой стоимости производительности и удобочитаемости. Тебе следует это попробовать. Или, может быть, он не понимал, что 'UNION' подразумевает' DISTINCT' ... – Aaronaught

+0

@Aaronaught: Это плохо написанный запрос, и обновление рискует упустить данные, которые были ранее возвращены. –

2

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

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

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

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

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

синтаксис Избегайте как WHERE MyField Как «% тест%»

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

+0

Какая альтернатива 'LIKE '% test%''? Производительность явно паршивая, но если вам действительно нужно искать подстроку ... – Aaronaught

+1

@Aaronaught: Full Text Search (FTS). –

+0

@HLGEM: +1, и я благодарен, что SQL Server вернет ошибку, если вы попытаетесь определить 'ORDER BY' в представлении без использования' TOP' :: shivers :: –

2

Избегайте

CURSOR - ОПС на основе использования набора

SELECT * - имя, которое вы КОЛОННЫ явно

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

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