Удаляют ли базы данных Oracle SQL повторяющиеся записи в предложении where-in?

Прошу прощения, если это повторяющийся вопрос: я искал, но нашел много не связанных между собой тем/вопросов.

Например

select * 
from table_of_things 
where id in (1, 2, 3, 4, 5, 6, 1, 2, 1)

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


person David Crane    schedule 06.06.2016    source источник


Ответы (2)


Как и вы, я не смог найти какой-либо конкретной записи в документации, указывающей, упрощается ли список выражений из соображений производительности. Это следует рассматривать как деталь реализации. Но, основываясь на наблюдениях, кажется, что оптимизатор выполняет оптимизацию.

В Oracle 12c я выполнил пример запроса, очень похожий на ваш, с включенным autotrace, и он перечислил предикаты фильтра, которые он использовал. Как и ожидалось, список предикатов был упрощен, чтобы исключить дубликаты.

Используйте autotrace в своем запросе, если хотите проверить это самостоятельно.

person sstan    schedule 06.06.2016
comment
Это именно тот ответ, который я искал. Большое спасибо. Я буду использовать выход autotrace — в настоящее время я не использую 12c! - person David Crane; 06.06.2016

Вроде, как бы, что-то вроде. Или, что более важно, это совершенно неважный вопрос, как реализована логика.

IN следует простой логике. Он оценивается как истина, когда левый операнд находится в списке, следующем за IN. Он оценивается как одинаково истинный, когда операнд находится в списке несколько раз.

На практике я предполагаю, что Oracle удаляет дубликаты на этапе компиляции. Но определение IN одинаково независимо от того, присутствуют ли дубликаты.

person Gordon Linoff    schedule 06.06.2016
comment
Спасибо за ответ; Я понимаю, что логика такая же, чего и следовало ожидать, но мой вопрос касается проблем с эффективностью в больших предложениях IN. Учитывая ваше предположение, есть ли способ убедиться, что это так, согласно второй части моего вопроса? - person David Crane; 06.06.2016