Выполнение запроса Oracle в предложении where - PullRequest
2 голосов
/ 03 марта 2011

Мы пытаемся выполнить запрос на выборку, который использует имя столбца в операторе case и, если в предложении where используется то же имя столбца, он входит в бесконечный цикл.

например

select empId,empName,
        (case when empDept in ('A','B','C') then empAge
              when empDept in ('E','F','G') then empExp 
              else 'Dept-Not found' end) 
        from employee  where empDept in ('A','B','C','D','E','F','G')

Неважно, даже если мы добавим или предложим в предложении where вместо in.

РЕДАКТИРОВАТЬ: отредактировал запрос

Ответы [ 2 ]

4 голосов
/ 03 марта 2011

ясно, что происходит что-то еще. Предложение WHERE оценивается перед предложением SELECT (список столбцов), нет способа создать бесконечный цикл.

Рассмотрим (10.2.0.1):

SQL> CREATE TABLE employee AS
  2  SELECT 1 empId, 'e1' empName, 1 empAge, 10 empExp, 'A' empDept FROM dual
  3  UNION ALL SELECT 2, 'e2', 2, 9, 'B' FROM dual
  4  UNION ALL SELECT 3, 'e3', 3, 8, 'C' FROM dual
  5  UNION ALL SELECT 4, 'e4', 4, 7, 'D' FROM dual
  6  UNION ALL SELECT 5, 'e5', 5, 6, 'E' FROM dual
  7  UNION ALL SELECT 6, 'e6', 6, 5, 'F' FROM dual;

Table created

SQL> select empId,empName,
  2          (case when empDept in ('A','B','C') then to_char(empAge)
  3                when empDept in ('E','F','G') then to_char(empExp)
  4                else 'Dept-Not found' end)
  5          from employee  where empDept in ('A','B','C','D','E','F','G');

     EMPID EMPNAME (CASEWHENEMPDEPTIN('A','B','C'
---------- ------- ----------------------------------------
         1 e1      1
         2 e2      2
         3 e3      3
         4 e4      Dept-Not found
         5 e5      6
         6 e6      5

Как вы можете видеть в моем примере, мне пришлось добавить to_char к выражениям вашего дела, потому что все результаты из дела должны иметь одинаковый тип. Без to_char в моем случае я получил ORA-00932. Может быть, ваш инструмент зависает, когда запрос возвращается с ошибкой?

3 голосов
/ 03 марта 2011

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

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

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

...