Sql 优化查询和导出

Sql 优化查询和导出,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,下面的代码给出了结果,但需要5分钟才能执行,之后我需要将数据导出到文本。有120万条记录,即使在9小时后也无法导出 您能否帮助优化查询和提高执行性能,并帮助加快导出速度 我不能在SQL developer中使用偏移量和提取 WITH NAGP AS (SELECT Company_common_id, PROFILECLASSVALUE FROM (SELECT /* + PARALLEL( gp, 20)*/

下面的代码给出了结果,但需要5分钟才能执行,之后我需要将数据导出到文本。有120万条记录,即使在9小时后也无法导出

您能否帮助优化查询和提高执行性能,并帮助加快导出速度

我不能在SQL developer中使用偏移量和提取

WITH NAGP AS
         (SELECT Company_common_id, PROFILECLASSVALUE
            FROM (SELECT /* + PARALLEL( gp, 20)*/
                        co.Company_common_id,
                         gp.PROFILECLASSVALUE,
                         RANK() OVER(PARTITION BY co.Company_common_id ORDER BY co.commit_date DESC) RK
                    FROM stg_cmat.cmat_sync_ref co, stg_cmat.cmat_enrich_ref gp
                   WHERE     gp.transaction_id = co.transaction_id
                         AND co.event = 'ENRICHMENT'
                         AND gp.profilename = 'EnrichmentProfile'
                         AND gp.PROFILECLASSNAME = 'NAGP ID')
           WHERE RK = 1)
SELECT EC.system_serial_number,
       EC.cmat_customer_id EC_cmat_customer_id,
       EC.system_status EC_system_status,
       (SELECT n.PROFILECLASSVALUE
          FROM NAGP n
         WHERE n.Company_common_id = EC.cmat_customer_id)
           EC_NAGP_ID,
       SN.cmat_customer_id SN_cmat_customer_id,
       SN.system_status SN_system_status,
       (SELECT n.PROFILECLASSVALUE
          FROM NAGP n
         WHERE n.Company_common_id = SN.cmat_customer_id)
           SN_NAGP_ID
  FROM (SELECT a.system_serial_number,
               a.role_id,
               a.cmat_customer_id,
               s.system_status
          FROM EIM.eim_latest_sys_party_role a, eim.eim_system s
         WHERE     a.system_serial_number = s.system_serial_number(+)
               AND a.role_id = 1) EC,
       (SELECT z.system_serial_number,
               a.role_id,
               a.cmat_customer_id,
               s.system_status
          FROM EIM.eim_latest_sys_party_role a, eim.eim_system s
         WHERE     a.system_serial_number = s.system_serial_number(+)
               AND a.role_id = 19) SN
 WHERE EC.system_serial_number = SN.system_serial_number;
执行后得到的结果

SYSTEM_SERIAL_NUMBER  EC_CMAT_CUSTOMER_ID  EC_SYSTEM_STATUS  EC_NAGP_ID SN_CMAT_CUSTOMER_ID  SN_SYSTEM_STATUS  SN_NAGP_ID
105977453         6000789              ACTIVE            357033     6000789              ACTIVE            357033
105977457         6000789              ACTIVE            357033     6000789              ACTIVE            357033
105977459         6000789              ACTIVE            357033     6000789              ACTIVE            357033
105977460         6000789              ACTIVE            357033     6000789              ACTIVE            357033
105977462         6000789              ACTIVE            357033     6000789              ACTIVE            357033
1059776           5016269              ACTIVE            256841     5016269              ACTIVE            256841
1059781           5023315              DECOMISSIONED     256842     5023315              DECOMISSIONED     256842
1059783           5023315              DECOMISSIONED     256842     5023315              DECOMISSIONED     256842
1059785           5023315              DECOMISSIONED     256842     5023315              DECOMISSIONED     256842
1059792           5016269              DECOMISSIONED     256841     5016269              DECOMISSIONED     256841
105980000         14031077             ACTIVE            14032472   14031077             ACTIVE            14032472

由于您尚未提供有关表或数据的信息,这完全是猜测,但使用以下查询可能会带来一些好处:

with latest_co_transaction as (select company_common_id,
                                      max(transaction_id) keep (dense_rank first order by commit_date_desc)
                               from   stg_cmat.cmat_sync_ref
                               where  event = 'ENRICHMENT'
                               group by company_common_id),
                      nagp as (select co.company_common_id,
                                      gp.profileclassvalue
                               from   latest_co_transaction co
                                      inner join stg_cmat.cmat_enrich_ref gp on (gp.transaction_id = co.transaction_id)
                               where  gp.profilename = 'EnrichmentProfile'
                               and    gp.profileclassname = 'NAGP ID'),
                     ec_sn as (select a.system_serial_number,
                                      max(case when role_id = 1 then a.cmat_customer_id end) ec_cmat_customer_id,
                                      max(case when role_id = 1 then s.system_status end) ec_system_status,
                                      max(case when role_id = 19 then a.cmat_customer_id end) sn_cmat_customer_id,
                                      max(case when role_id = 19 then s.system_status end) sn_system_status
                               from   eim.eim_latest_sys_party_role a
                                      left outer join eim.eim_system s on (a.system_serial_number = s.system_serial_number)
                               where  a.role_id in (1, 19)
                               group by a.sstem_serial_number)
select ec.system_serial_number,
       ec_cmat_customer_id,
       ec_system_status,
       (select n.profileclassvalue
        from   nagp n
        where  n.company_common_id = ec_cmat_customer_id) ec_nagp_id,
       sn_cmat_customer_id,
       sn_system_status,
       (select n.profileclassvalue
        from   nagp n
        where  n.company_common_id = sn_cmat_customer_id)  sn_nagp_id
from ec_sn;
这假设
system\u serial\u number
role\u id
列在
eim.eim\u latest\u sys\u party\u role
表中是唯一的,以启用数据透视。由于不知道
eim.eim\u latest\u sys\u party\u角色
eim.eim\u系统
中有多少数据,也不知道您的索引中有多少数据,您可能会发现分组方式比加入方式更有效。也许不是

关于您的
nagp
子查询,我将其分成两部分,过滤
stg\u cmat.cmat\u sync\u ref
表中的行,以获取最新
提交日期的
事务id
,然后将其加入
stg\u cmat.cmat\u ref
表。这将有助于加快查询速度

我将针对nagp的标量子查询保留在原来的位置,因为您可能会从标量子查询缓存中获益

添加以下索引也可能会带来好处:

  • stg_cmat.cmat_sync_ref:(公司通用id、提交日期、交易id)
  • stg_cmat.cmat_enrich_ref:(事务\u id,profilename,profileclassname,profileclassvalue)
  • eim.eim\u最新的系统方角色(系统序列号、角色id、cmat\u客户id)
  • eim.eim_系统(系统序列号、系统状态)

如果您想让人们阅读,请格式化您的代码!要获得关于优化查询的帮助,您应该发布解释计划、相关表的结构、索引以及关于每个表的基数的一些信息