Выполнение запроса без использования предложения OR - PullRequest
1 голос
/ 18 октября 2010

Я столкнулся с проблемой. У меня есть один запрос

Select * from tabA 
where (a) in (a,b,c) 
OR b in (a,b,c) 

Я хочу столкнуться с проблемой производительности из-за этого запроса, поскольку мне нужно удалить условие или, поэтому я попытался выполнить следующий запрос:

Select * from tabA 
where (a,b) in (a,b,c) 

но этот запрос не работает, пожалуйста, помогите. Я не хочу использовать условие 'или'.

Ответы [ 3 ]

4 голосов
/ 18 октября 2010

Если вам логически необходимо условие ИЛИ, тогда это то, что вам нужно. Нет ничего плохого в использовании OR. Если оба столбца проиндексированы, то запрос, вероятно, займет больше времени, чем выполнение этих двух запросов независимо друг от друга:

select * from tabA 
where a in (a,b,c);

select * from tabA 
where b in (a,b,c);

Оптимизатор вполне может сделать это и объединить результаты следующим образом:

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=2 Bytes=256)
   1    0   CONCATENATION
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'TABA' (Cost=2 Card=1 Bytes=128)
   3    2       INDEX (RANGE SCAN) OF 'TABA_A_IDX' (NON-UNIQUE) (Cost=1 Card=1)
   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'TABA' (Cost=2 Card=1 Bytes=128)
   5    4       INDEX (UNIQUE SCAN) OF 'TABA_B_IDX' (NON-UNIQUE) (Cost=1 Card=1)
3 голосов
/ 18 октября 2010

если логика остается прежней - вы можете попробовать UNION

Select * from tabA  
where (a) in (a,b,c)  
union
Select * from tabA  
where b in (a,b,c)  

также, проверить свои индексы и объяснить результаты плана - индексация может решить первоначальные проблемы ИЛИ.

2 голосов
/ 18 октября 2010

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

select * from tabA 
where (a,b) in ((a,b), (a,c), (b,c) etc.

В любом случае in условие преобразуется в несколько or условий во время выполнения запроса.

При условии, что вы покажете структуру таблицы и план выполнения, люди смогут помочь вам более эффективно.

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