Минус или не равно?Что лучше? - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть таблица с 3 столбцами стоимости, from_date и to_date.Я должен выбрать все строки, которые не имеют даты с начала месяца до конца месяца.То есть, выберите строки, которые не имеют исходную дату как «1-НОЯБРЯ 2011» и «точную дату» как «30-НОЯБРЯ 2011».Я написал 2 запроса.

SELECT * FROM TABLE1 WHERE FROM_DATE <> '1-NOV-2011' OR TO_DATE <> '30-NOV-2011';

и

SELECT * FROM TABLE1 MINUS SELECT * FROM TABLE1 WHERE FROM_DATE = '1-NOV-2011' AND TO_DATE = '30-NOV-2011';

Какой из них даст лучшую производительность?

Ответы [ 4 ]

1 голос
/ 09 декабря 2011

Уточнение

Во-первых, два запроса не эквивалентны.Следующие наборы будут давать те же результаты:

Набор 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, он может использовать сканирование индекса для получения дисквалифицирующих строк, а затем выполнить операцию набора для удаления этих результатов из первого набора.

Будет ли это на самом деле быстрее или нет, вероятно, во многом будет зависеть от ваших данных.Как всегда, лучший способ определить, что будет быстрее для вашего приложения, - выполнить собственные тесты.

0 голосов
/ 16 декабря 2011

1-й лучше, так как он включает в себя только одно сканирование, которое не содержит никаких входных или нет входных данных. перейти к 1-му первому ...

0 голосов
/ 08 декабря 2011

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

Отказ от ответственности: это упрощенное объяснение, и я ничего не знаю о внутренней работе Oracle, просто как я ожидаю, что она будет работать.

0 голосов
/ 08 декабря 2011

Полагаю, первая версия будет иметь лучшую производительность, чем вторая.

SELECT происходит дважды во втором запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...