объединить против явного в условии - PullRequest
0 голосов
/ 28 сентября 2011

Существуют ли веские причины в базе данных Oracle для предпочтения в общем запросе условия фильтра, выраженного таблицей соединений, вместо фильтра с условием IN с большим количеством элементов (несколько сотен). Я имею в виду, если вы можете написать что-то вроде

ВЫБРАТЬ .... ОТ t1 ГДЕ t1. IN (......) с 100-200 предметами

или лучше поменять его на

ВЫБРАТЬ .... ОТ t1 ПРИСОЕДИНЯЙТЕСЬ К T2 НА T1. = T2.

где таблица t2 содержит значения, необходимые для фильтра

большое спасибо


Спасибо за ответы

Я пытаюсь объяснить ситуацию и мои сомнения У меня есть пользовательский интерфейс, где пользователь может выбрать в элементе управления много элементов (например, один или несколько человек, список специалистов). Я могу использовать этот список напрямую, добавив его в состояние IN, то есть ВЫБРАТЬ .... ОТ t1 ГДЕ t1. IN (p1 ... p200) но это решение может вызвать некоторые проблемы: - если выбранных элементов много, то строка может превышать лимит строки sql (я помню, в Oracle существовал лимит в 4000 байт) - состояние IN со многими значениями может быть неэффективным

Таким образом, альтернативное решение может быть 1. создать временную таблицу с выбранным элементом 2. используя соединение между временной таблицей и основной таблицей

Обычно заполнение временной таблицы происходит быстро, и мой вопрос в том, является ли это второе решение более эффективным по сравнению с первым

Ответы [ 3 ]

1 голос
/ 28 сентября 2011

Из того, что я вижу, есть два разных вопроса.

a) Использование статического списка / таблицы.

Если список элементов (100-200) представляет собой список статических значений, например, например, список стран или валют, яЯ думаю, что было бы лучше добавить это в статическую таблицу / таблицу параметров и изменить запрос на использование таблицы.Если вам нужно отследить новый код / ​​страну и т. Д. Позже, все, что вам нужно сделать позже, это вставить новый код в таблицу поиска.

Кроме того, если есть другие запросы, использующие те же условия (и, как правило, есть), эта справочная таблица будет способствовать повторному использованию.

select * from t1 where id in (select id from t2);
and 
select * from t1,t2
 where t1.id = t2.id 

эквивалентны и лучше, чем

select * from t1 where 
  id in ('USD','EUR'..... ); -- 100 to 200 items to track.

b) Выбор соединения против IN:

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

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

Полезная ссылка: http://explainextended.com/2009/09/30/in-vs-join-vs-exists-oracle/

1 голос
/ 28 сентября 2011

Два запроса не являются функционально эквивалентными, поэтому вопрос несколько странный - я не могу себе представить, что это происходит очень часто (если вообще когда-либо).

Тем не менее, если у вас есть таблица, содержащаяточно строки, которые должны быть отфильтрованы, JOIN был бы более естественным / стандартным способом обработки.

Идея в первом примере состоит в том, чтобы запросить t2, чтобы получить все значения, а затем добавить их вколлекцию и генерировать предложение IN?Если это так, я бы сказал, что это очень плохая практика.

0 голосов
/ 28 сентября 2011
...