Предикаты I стр. 3 |
||
Предикат в предложении WHERE выполняет реляционную операцию ограничения, т.е. строки, появляющиеся на выходе предложения FROM ограничиваются теми, для которых предикат дает значение TRUE. Если cond1 и cond2 являются простыми условиями, то ограничение по предикату cond1 AND cond2 эквивалентно пересечению ограничений по каждому из предикатов. Ограничение по предикату cond1 OR cond2 эквивалентно объединению ограничений по каждому из предикатов, а ограничение по предикату NOT cond1 эквивалентно взятию разности, когда от исходного отношения вычитается ограничение по предикату cond1. Обратимся к примерам. Получить информацию о моделях ПК производителя A. Здесь cond1: maker = 'A' , cond2: type = 'pc'. cond1 AND cond2Пересечение
Получить информацию о моделях производителей A и B. Здесь cond1: maker = 'A' , cond2: maker = 'B'. cond1 OR cond2Объединение
В свою очередь, условия condX могут не быть простыми. Например, Получить информацию о моделях ПК производителей A и B. Решение
Найти модели, которые не являются ПК Здесь cond1: type = 'pc' NOT cond1Разность
Несколько слов о производительностиЕсли на столбцах, по которым выполняется ограничение нет индексов, при выполнении запроса будет выполнено сканирование таблицы. В первых вариантах решений такое сканирование будет выполнено один раз, в то время как в решениях на основе объединения, пересечения и разности запросов таблица сканируется дважды, плюс будет выполнена операция, сравнивающая наборы строк, возвращаемые каждым из запросов (например, Nested Loops). Это делает запрос менее производительным, хотя, возможно, существуют оптимизаторы, способные построить один и тот же план в двух сравниваемых нами случаях. |