Новость из категории: Информация

SQL Server: оператор WHERE

Содержание:
1. WHERE для фильтрации, ON для сопоставления (Вы читаете данный раздел);
2. Аргументы поиска и равенство против отличия. Часть I;
3. Аргументы поиска и равенство против отличия. Часть II;
4. Аргументы поиска и равенство против отличия. Часть III;
5. Укороченная операция;
6. WHERE и псевдонимы столбцов.
SQL Server: оператор WHERE

WHERE для фильтрации, ON для сопоставления

Самой частой причиной возникновения недоразумений в SQL является, конечно же, проблема определения принадлежности предиката, используемого в том или ином запросе, оператору WHERE (в некоторых случаях вместо него может выступать оператору ON). В данном случае вопросы могут возникнуть не только у новичков, но и у специалистов, работающих в среде SQL Server уже не один год. Мы начнем с того обстоятельства, что в случае с внутренним соединением, по крайней мере для стандартного SQL, как ON, так и WHERE служат для одинаковой пели фильтрации, то есть в обоих случаях, если предикат для данной строки дает значение true, строка возвращается, иначе (если значение предиката false или unknown) строка отбрасывается. Рассмотрим запрос из листинга ниже.

SQL Server: оператор WHERE
Запрос о дате заказа

SQL Server: оператор WHERE
Результаты запроса о дате заказа

Поскольку соединение является внутренним, логическое значение запроса одинаково, независимо от того, какой из трех предикатов указан в операторе ON или операторе WHERE. Все предикаты считаются предикатами фильтрации. Этот запрос формирует вывод, представленный на экране выше.

С точки зрения логической обработки запросов оператор WHERE вычисляется после оператора FROM со всеми его табличными операторами, как соединение в нашем примере. Но с точки зрения физической обработки запросов SQL Server может выполнить определенную реорганизацию, сохраняя смысл запроса (окончательный набор результатов). Например. SQL Server часто выполняет так называемую передачу предикатов (predicate pushdown), когда вместо обработки предикатов из оператора WHERE, которые применяются к единственной таблице после соединения, они обрабатываются перед соединением. Если существуют вспомогательные индексы, их можно использовать для работы с фильтрами. Даже если этого не сделать, сокращение входных наборов перед соединением позволяет сократить количество действий, выполняемых соединением. На рисунке ниже показан план выполнения для нашего запроса.

SQL Server: оператор WHERE
Передача предиката

Обратите внимание, что произошла передача предиката. В настоящее время не существует индексов для поддержки фильтров, поэтому план выполняет просмотр двух входных таблиц, но все же передает предикат при проверке фильтров в процессе сканирования с целью сокращения наборов, к которым приходится применять соединение.


Читать дальше...

Рейтинг статьи

Оценка
0/5
голосов: 0
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх