1

我要为我的项目执行以下查询:

SELECT 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.actual_completion_date >= (SELECT MAX (alert_logged_time)
                                          FROM allen.main_table
                                         WHERE program_status = 'No Schedule')
         AND fcr.phase_code = 'C';

但是上面的查询需要很长时间才能运行。当我给出相应的时间作为输入时,而不是

SELECT MAX (alert_logged_time) 
FROM allen.main_table 
WHERE program_status = 'No Schedule'

我什至很快就得到了输出。为什么呢?无论如何要纠正这个?

4

3 回答 3

2

我怀疑差异的原因是原始慢查询有远程本地表,而修改后的查询只有远程表

当 Oracle 查询本地和远程表的混合时,它必须决定在哪里进行连接。如果要在本地执行连接(默认情况下通常首选),则远程表中的所有数据都将通过数据库链接传输。传输的数据量可能比查询的实际结果大很多倍。

另一方面,当查询中的所有表都是远程的时,仅传输查询的结果,而计算发生在远程站点。

您可以使用/*+ DRIVING_SITE (<table_alias>)*/提示指示 Oracle 在指定表的位置执行连接,从而限制来回的数据量。

将提示添加/*+ DRIVING_SITE(fcr) */到您的查询应该使其像您修改的查询一样执行。

于 2013-06-19T09:56:51.690 回答
1

您可以尝试改用联接

SELECT 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@aadsp_to_acptr fcr,
             apps.fnd_concurrent_programs_tl@aadsp_to_acptr fcpt,
             apps.fnd_user@aadsp_to_acptr fu,
             apps.fnd_responsibility_tl@aadsp_to_acptr frt,
             (SELECT MAX (alert_logged_time) as max_time
              FROM allen.main_table
              WHERE program_status = 'No Schedule')  SQ
       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.actual_completion_date >= SQ.max_time
         AND fcr.phase_code = 'C';
于 2013-06-19T09:46:26.757 回答
1

由于您的子查询符合 Oracle 的标量子查询缓存功能,我怀疑性能缓慢的原因可能是以下任何(或两者)缺少索引:

  • allen.main_table.program_status
  • allen.main_table.alert_logged_time
于 2013-06-19T09:44:16.927 回答