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

SQL Server: оператор WHERE. WHERE и псевдонимы столбцов. Часть III

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

SQL Server обрабатывает эту форму как SARG, что видно на плане для данного запроса (см. рисунок ниже). Любопытно, что стандартный SQL поддерживает предикат DISTINCT (https://connect.microsoft.com/SQLServer/feedback/details/286422/add-language-and-optimizer-support-for-iso-distinct-predicate) в качестве альтернативы для сравнения на равенство и неравенство. Форма предиката — IS |NOT| DISTINCT FROM . Концепция различимости отличается от равенства при обработке значений NULL. Предикат IS NOT DISTINCT FROM выдает значение true, когда обе стороны представляют собой NULL (или значение, отличное от NULL и такое же) или false в противном случае. Предикат IS DISTINCT FROM приносит значение false, когда обе стороны представляют собой NULL (или значение, отличное от NULL и такое же) или true в противном случае. Если бы этот предикат поддерживался в Т-SQL, можно было бы использовать следующий предикат фильтрации в нашем запросе:
WHERE region IS NOT DISTINCT FROM @region

SQL Server: оператор WHERE. WHERE и псевдонимы столбцов. Часть III
План для запроса Query 5

SQL Server: оператор WHERE. WHERE и псевдонимы столбцов. Часть III
Альтернатива предикату DISTINCT

К сожалению, T-SQL не поддерживает предикат DISTINCT, но, как показано в статье Пола Уайта «Undocumented Query Plans: Equality Comparisons» (http://sqlblog.com/blogs/paul_white/archive/2011/06/22/undocumented-query-plans-equality-comparisons.aspx), выход из ситуации есть. В листинге выше приводится элегантная альтернатива, поддерживаемая в T-SQL (назовем этот запрос Query 6).

В основу данного метода положено то обстоятельство, что в операторах UNION, ЕХСРЕТ и INTERSECT для сравнения строк используется отличие, а не равенство. Если регион не отличается от @region, оператор INTERSECT возвращает одну строку, EXISTS возвращает значение true и возвращается строка во внешнем запросе. Если регион отличается от @region, оператор INTERSECT возвращает пустой набор, EXISTS возвращает значение false и возвращается строка во внешнем запросе. Именно это нам и нужно. Следует отметить, что оптимизатор рассматривает данную форму как SARG и план для этого запроса (Query 6) — точно такой же, как показанный для Query 5 на рисунке 8. Поскольку предикат — SARG, включается поиск в индексе.

SQL Server: оператор WHERE. WHERE и псевдонимы столбцов. Часть III
Сравнение на основе отличия

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

Как уже отмечалось, типовая альтернатива для «не равно», в случае когда вы получаете значение true при одном операнде NULL и другом, отличном от NULL, - IS DISTINCT FROM.Для наших столбца region и параметра @region используется следующий предикат фильтрации: WHERE region IS DISTINCT FROM ©region Эта форма также не поддерживается в Т-SQL, но существует другая изящная форма:
WHERE NOT EXISTS (SELECT region INTERSECT SELECT @region)

Иначе вместо проверки пересечения пустого набора можно вычислить разность непустого набора, например:
WHERE EXISTS (SELECT region EXCEPT SELECT @region)

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

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

Поделиться

Перевести статью:

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

Комментарии

Информация

^ Наверх