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 apps.fnd_concurrent_requests@db_link fcr,
       apps.fnd_concurrent_programs_tl@db_link fcpt,
       apps.fnd_user@db_link fu,
       apps.fnd_responsibility_tl@db_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 apps.fnd_concurrent_requests@db_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 apps.fnd_concurrent_requests@db_link fcr,
       apps.fnd_concurrent_programs_tl@db_link fcpt,
       apps.fnd_user@db_link fu,
       apps.fnd_responsibility_tl@db_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 apps.fnd_concurrent_requests@db_link
MINUS SELECT parent_request_id FROM apps.fnd_concurrent_requests@db_link)

このクエリは、毎回約 300 ~ 400 行を返します。しかし、2 つのクエリの違いがわかりません。また、両方のクエリの実行には 1 時間以上かかります。効率を上げるには?

4

1 に答える 1

1

Parent_request_id には null 値が含まれています。次に、最初の副選択の結果に NULL 値が含まれ、NOT IN 節の結果は TRUE ではなく UNKNOWN になります。これを比較してください:

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 を照会するデータベースに選択を保存します。あなたの選択では、すべてのオブジェクトがリモートデータベースに保存されており、オプティマイザーはあなたの選択権を調べることができません。

于 2013-06-25T11:06:29.747 に答える