插入百万条记录时Oracle查询优化
我们正在尝试在生产环境中执行一个查询,这出乎意料地花费了5个多小时,但仍未完成。此查询预计将插入180万条记录。我完全控制FSG_WRK.FSG_PRCB_CSP_EXT_HR表,但FAC.CMC_PRSQ_SITE_QA是我们的系统表,我无法在其上添加任何索引 请建议 查询: 解释计划:插入百万条记录时Oracle查询优化,oracle,oracle-sqldeveloper,query-optimization,oracle12c,Oracle,Oracle Sqldeveloper,Query Optimization,Oracle12c,我们正在尝试在生产环境中执行一个查询,这出乎意料地花费了5个多小时,但仍未完成。此查询预计将插入180万条记录。我完全控制FSG_WRK.FSG_PRCB_CSP_EXT_HR表,但FAC.CMC_PRSQ_SITE_QA是我们的系统表,我无法在其上添加任何索引 请建议 查询: 解释计划: 如果您“只是”将数据从A迁移到B,您可能会看到,如果A合并到A,而A不匹配,那么在语句末尾插入不是更好的选择 180万条记录不会对您的oracle实例造成太大的挑战。顺便说一句,看起来您希望通过EXT.CAN
如果您“只是”将数据从A迁移到B,您可能会看到,如果A合并到A,而A不匹配,那么在语句末尾插入不是更好的选择
180万条记录不会对您的oracle实例造成太大的挑战。顺便说一句,看起来您希望通过EXT.CANC_DT在每个组中获取最新的行。如果是这种情况,则更容易使用: 插入FAC.CMC\u PRSQ\u站点\u QA 带CTE MPIN、税务识别号、POS ADR识别号、BSAR识别号、CANC识别号、EFF识别号、EXTND识别号 像 选择 分机MPIN、分机TAX\u ID\u NBR、分机POS\u ADR\u ID、分机BSAR\u ID ,MAXEXT.CANC_DT CANC_DT ,maxet.EFF_DT keepdense_按EXT.CANC_DT desc EFF_DT排名第一 ,MAXEXT.EXTND\u HRS按EXT.CANC\u DT desc EXTND\u HRS排名第一 来自FSG_WRK.FSG_PRCB_CSP_EXT_HR EXT 在哪里 按EXT.MPIN、EXT.TAX\u ID\u NBR、EXT.POS\u ADR\u ID、EXT.BSAR\u ID分组 选择不同的 PRSQ.PRPR_ID, PRSQ.PRAD_ID, PRSQ.PRAD_类型, PRSQ.PRAD_EFF_DT, EXT.EFF_DT PRSQ_LAST_VER_DT, 当TRIMEXT.EXTND_HRS='W'然后是'EHRW'时的情况 当TRIMEXT.EXTND_HRS='B'然后是'EHRB' 当TRIMEXT.EXTND_HRS='E'然后是'EHRE' 当TRIMEXT.EXTND\u HRS='N'然后是'EHRN' 作为PRSQ_MCTR_项目结束, PRSQ.PRSQ_INIT_VER_DT, 分机CANC_DT PRSQ_NEXT_VER_DT, PRSQ.PRSQ_RCVD_VER_DT, PRSQ.PRSQ_MCTR_VSRC, PRSQ.PRSQ_PRIM_VER_IND, PRSQ.PRSQ_MCTR_VRSL, “”PRSQ_姓氏, PRSQ.PRSQ_MCTR_VMTH, ""记者问:, PRSQ.PRSQ_锁_令牌, PRSQ.ATXR\u源\u ID 从FAC.CMC_PRSQ_站点_QA PRSQ 加入CTE EXT 在EXT.MPIN=substrpsq.prprpr_ID上,1,9 TRIMEXT.BSAR_ID=TRIM PRSQ.PRSQ_LAST_VER_NAME 和TRIM EXT.POS_ADR_ID=TRIM PRSQ.PRSQ_注释 TRIMEXT.CANC_DT=TRIMPRSQ.PRSQ_NEXT_VER_DT 以及“SAID”中的PRSQ.PRSQ_MCTR_项目 而且不存在 从FAC.CMC\u NWPR\u关系NWPR中选择1 其中NWPR.PRPR_ID=PRSQ.PRPR_ID 和NWPR.nww_ID='MINETWORK' ;
能否启用sql跟踪并将其发布到此处?在此插入过程中,我们需要精确的等待事件。线路负载表中的上次运行时间太长。可能有我不想猜测的表或行锁,所以最好得到真正的等待事件。如果您的EE具有许可的诊断和调优包,那么提供ashrpt输出或原始ash转储将更容易
INSERT INTO FAC.CMC_PRSQ_SITE_QA
WITH CTE (MPIN, TAX_ID_NBR, POS_ADR_ID, BSAR_ID, CANC_DT, EFF_DT, EXTND_HRS)
AS(
SELECT EXT.MPIN ,
EXT.TAX_ID_NBR ,
EXT.POS_ADR_ID ,
EXT.BSAR_ID ,
temp.CANC_DT ,
EXT.EFF_DT ,
EXT.EXTND_HRS
FROM FSG_WRK.FSG_PRCB_CSP_EXT_HR ext
INNER JOIN ( SELECT EXT.MPIN,
EXT.TAX_ID_NBR,
EXT.POS_ADR_ID,
EXT.BSAR_ID,
MAX(EXT.CANC_DT) CANC_DT
FROM FSG_WRK.FSG_PRCB_CSP_EXT_HR EXT
WHERE FLAG ='Y'
GROUP BY EXT.MPIN, EXT.TAX_ID_NBR, EXT.POS_ADR_ID, EXT.BSAR_ID) temp
ON( ext.MPIN = temp.MPIN
AND ext.TAX_ID_NBR = temp.TAX_ID_NBR
AND ext.POS_ADR_ID = temp.POS_ADR_ID
AND ext.BSAR_ID = temp.BSAR_ID
AND ext.CANC_DT = temp.CANC_DT)
)
SELECT DISTINCT
PRSQ.PRPR_ID,
PRSQ.PRAD_ID ,
PRSQ.PRAD_TYPE,
PRSQ.PRAD_EFF_DT,
EXT.EFF_DT PRSQ_LAST_VER_DT,
CASE WHEN TRIM(EXT.EXTND_HRS)='W' THEN 'EHRW'
WHEN TRIM(EXT.EXTND_HRS)='B' THEN 'EHRB'
WHEN TRIM(EXT.EXTND_HRS)='E' THEN 'EHRE'
WHEN TRIM(EXT.EXTND_HRS)='N' THEN 'EHRN'
END AS PRSQ_MCTR_ITEM,
PRSQ.PRSQ_INIT_VER_DT,
EXT.CANC_DT PRSQ_NEXT_VER_DT,
PRSQ.PRSQ_RCVD_VER_DT,
PRSQ.PRSQ_MCTR_VSRC,
PRSQ.PRSQ_PRIM_VER_IND,
PRSQ.PRSQ_MCTR_VRSL,
' ' PRSQ_LAST_VER_NAME,
PRSQ.PRSQ_MCTR_VMTH,
' ' PRSQ_COMMENT,
PRSQ.PRSQ_LOCK_TOKEN,
PRSQ.ATXR_SOURCE_ID
FROM FAC.CMC_PRSQ_SITE_QA PRSQ
JOIN CTE EXT
ON EXT.MPIN = SUBSTR(PRSQ.PRPR_ID,1,9)
AND TRIM(EXT.BSAR_ID) = TRIM (PRSQ.PRSQ_LAST_VER_NAME)
AND TRIM (EXT.POS_ADR_ID) = TRIM (PRSQ.PRSQ_COMMENT)
AND TRIM(EXT.CANC_DT) = TRIM(PRSQ.PRSQ_NEXT_VER_DT)
AND PRSQ.PRSQ_MCTR_ITEM IN ('SAID')
AND NOT EXISTS(
SELECT 1 FROM FAC.CMC_NWPR_RELATION NWPR
WHERE NWPR.PRPR_ID = PRSQ.PRPR_ID
AND NWPR.NWNW_ID = 'MINETWORK'
);