2013-06-25 3 views
0
SELECT /*+ DRIVING_SITE(fcr) */ 
     fcr.request_id, 
     DECODE 
      (fcpt.user_concurrent_program_name, 
       'Report Set', fcr.description, 
       'Request Set Stage', fcr.description, 
       fcpt.user_concurrent_program_name 
      ) user_concurrent_program_name, 
     fcr.description, fcr.argument_text, fcr.concurrent_program_id, 
     fcr.parent_request_id, fcr.actual_start_date, 
     fcr.actual_completion_date, 
     ROUND ((fcr.actual_completion_date - fcr.actual_start_date) * 24 * 60, 
       4 
      ) runtime, 
     DECODE (fcr.phase_code, 'C', 'No Schedule') program_status, 
     fu.user_name, frt.responsibility_name, fcr.logfile_name 
    FROM [email protected]_link fcr, 
     [email protected]_link fcpt, 
     [email protected]_link fu, 
     [email protected]_link frt 
WHERE fcr.concurrent_program_id = fcpt.concurrent_program_id 
    AND fcr.requested_by = fu.user_id 
    AND fcr.responsibility_id = frt.responsibility_id 
    AND fcr.responsibility_application_id = frt.application_id 
    AND fcr.phase_code = 'C' 
    AND fcr.status_code IN ('C', 'G', 'E', 'X') 
    AND fcr.actual_completion_date >= SYSDATE - 1/24 
    AND fcr.requested_by = 1508715 
    AND fcr.request_id NOT IN (
          SELECT parent_request_id 
           FROM [email protected]_link) 

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

SELECT /*+ DRIVING_SITE(fcr) */ 
     fcr.request_id, 
     DECODE 
      (fcpt.user_concurrent_program_name, 
       'Report Set', fcr.description, 
       'Request Set Stage', fcr.description, 
       fcpt.user_concurrent_program_name 
      ) user_concurrent_program_name, 
     fcr.description, fcr.argument_text, fcr.concurrent_program_id, 
     fcr.parent_request_id, fcr.actual_start_date, 
     fcr.actual_completion_date, 
     ROUND ((fcr.actual_completion_date - fcr.actual_start_date) * 24 * 60, 
       4 
      ) runtime, 
     DECODE (fcr.phase_code, 'C', 'No Schedule') program_status, 
     fu.user_name, frt.responsibility_name, fcr.logfile_name 
    FROM [email protected]_link fcr, 
     [email protected]_link fcpt, 
     [email protected]_link fu, 
     [email protected]_link frt 
WHERE fcr.concurrent_program_id = fcpt.concurrent_program_id 
    AND fcr.requested_by = fu.user_id 
    AND fcr.responsibility_id = frt.responsibility_id 
    AND fcr.responsibility_application_id = frt.application_id 
    AND fcr.phase_code = 'C' 
    AND fcr.status_code IN ('C', 'G', 'E', 'X') 
    AND fcr.actual_completion_date >= SYSDATE - 1/24 
    AND fcr.requested_by = 1508715 
    AND fcr.request_id IN (SELECT request_id FROM [email protected]_link 
MINUS SELECT parent_request_id FROM [email protected]_link) 

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

ответ

1

Parent_request_id содержит нулевые значения, я прав? Тогда первый подзапрос содержит нулевые значения в результате, а в позиции NOT IN - UNKNOWN, а не TRUE. Сравните это:

select 'found' from dual 
    where 1 not in (2,3,4); 

'FOUN 
----- 
found 

и

select 'found' from dual 
    where 1 not in (2,3,4, null); 

no rows selected 

По эффективности - Есть много факторов, которые влияют на эффективность. Сначала я хотел бы сохранить ваш выбор в базе данных, который вы ссылаетесь на @db_link как на вид и запрашиваете this_view @ db_link. В вашем выборе все объекты хранятся в удаленной базе данных, а оптимизатор не может проверить ваше право выбора.