ORACLE: предложение CASE in WHERE требует больше времени для результата - PullRequest
0 голосов
/ 20 января 2020

Таблица сотрудников содержит 100 тыс. Данных.

Select emp.* 
from Employee emp 
  inner join Department dept 
     on dept.Dept_no = (case when emp.Dept_NO= 11 then (select Id from CONSTANT where costant_name = 'ABC' )
                             else emp.Dept_NO end );

Выполнение этого запроса занимает слишком много времени. Как сделать так, чтобы этот запрос работал быстро?

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Я думаю, вам следует избегать выражения select в предложении объединения.

Вы можете использовать left join следующим образом:

Select emp.* 
  from Employee emp 
Left join CONSTANT const on ( costant_name = 'ABC' ) 
inner join Department dept on dept.Dept_no = case when emp.Dept_NO <> 11 
           then emp.Dept_NO
           Else const.Id
           end ;

Я использовал left join с constant таблица, если в ней нет записи, удовлетворяющей costant_name = 'ABC', тогда запрос также должен возвращать другие записи, соответствующие таблице employee.

Cheers !!

0 голосов
/ 20 января 2020

Чтобы избежать select в case, cross join с constant может помочь. Хотя, я думаю, она (таблица constant) мала и возвращает только одну строку для этого условия, так что в любом случае это достаточно быстро.

SELECT e.*
  FROM employee e
       CROSS JOIN constant c
       JOIN department d
          ON d.dept_no =
                CASE WHEN e.dept_no = 11 THEN c.id ELSE e.dept_no END
 WHERE c.constant_name = 'ABC';

Тем временем проверьте, участвуют ли столбцы в операции объединения (dept_no ) индексируются.

Объясните план может раскрыть некоторую полезную информацию.

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