Уточнение
Во-первых, два запроса не эквивалентны.Следующие наборы будут давать те же результаты:
Набор 1
Запрос 1
SELECT * FROM TABLE1
WHERE NOT (FROM_DATE = '1-NOV-2011' AND TO_DATE = '30-NOV-2011');
Запрос 2
SELECT * FROM TABLE1
MINUS SELECT * FROM TABLE1
WHERE FROM_DATE = '1-NOV-2011' AND TO_DATE = '30-NOV-2011';
Набор 2
Запрос 1
SELECT * FROM TABLE1
WHERE FROM_DATE <> '1-NOV-2011' OR TO_DATE <> '30-NOV-2011';
Запрос 2
SELECT * FROM TABLE1
MINUS SELECT * FROM TABLE1
WHERE FROM_DATE = '1-NOV-2011' OR TO_DATE = '30-NOV-2011';
Ответ
Теперь к фактическому ответу.Первоначальный ответ заключается в том, что первый запрос (для любого набора) будет быстрее, поскольку он включает только один доступ к таблице, а не два.Однако это может быть не так.
Возможно, второй запрос будет быстрее.Во-первых, базе данных нужно будет выполнить полное сканирование таблицы, а затем проверить каждую строку на наличие дисквалифицирующих значений.Во втором случае он может выполнить полное сканирование таблицы без фильтра, чтобы выполнить первую половину запроса.Для второй половины, если есть индекс для FROM_DATE
и TO_DATE
, он может использовать сканирование индекса для получения дисквалифицирующих строк, а затем выполнить операцию набора для удаления этих результатов из первого набора.
Будет ли это на самом деле быстрее или нет, вероятно, во многом будет зависеть от ваших данных.Как всегда, лучший способ определить, что будет быстрее для вашего приложения, - выполнить собственные тесты.