Sql 优化查询和导出
下面的代码给出了结果,但需要5分钟才能执行,之后我需要将数据导出到文本。有120万条记录,即使在9小时后也无法导出 您能否帮助优化查询和提高执行性能,并帮助加快导出速度 我不能在SQL developer中使用偏移量和提取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)*/
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_系统(系统序列号、系统状态)
如果您想让人们阅读,请格式化您的代码!要获得关于优化查询的帮助,您应该发布解释计划、相关表的结构、索引以及关于每个表的基数的一些信息