【发布时间】:2013-10-02 06:36:09
【问题描述】:
看下面的执行计划。 它说甲骨文将从索引范围扫描开始...... 但这是不可能的,因为他没有任何值可查找,因为它从 ENI_TAVOLO_ETL_DETT 表中读取这些值。
执行计划不是说实话吗?
查询是:
SELECT DISTINCT
DTSC.TSC_ETL_ID "Tavolo ETL",
DTSC.TIPO_PROCESSO_COD "TIPO_PROCESSO",
dtsc.PUNTO_EROGAZIONE_COD "PUNTO_EROGAZIONE",
DTSC.FORNITURA_OLD_COD "FORNITURA",
DTSC.SOGGETTO_COD "SOGGETTO",
DTSC.CONTO_CLIENTE_COD "CONTO_CLIENTE",
(SELECT f1.eif_campo24
FROM etl_elab_interf_flat f1
WHERE f1.eif_campo198 = DTSC.id_messaggio
AND f1.idde_identif_dati_ext_id = DTSC.idde_identif_dati_ext_id
AND f1.eif_campo200 = 'FORNITURA_ENI'
AND f1.eif_campo29 = 'Nuovo')
"C_ORD_IT",
(SELECT TO_CHAR (
TRUNC (DataCompetenzaProcesso (dtsc.id_messaggio,
dtsc.idde_identif_dati_ext_id,
dtsc.tipo_processo_cod,
c.pia_pod_attesa_id)),
'DD/MM/YYYY')
FROM eni_flussi_hub c
WHERE c.flh_id_messaggio = dtsc.id_messaggio
AND dtsc.idde_identif_dati_ext_id = c.idde_identif_dati_ext_id)
"DATA COMPETENZA",
DTSC.id_messaggio "ID_MESSAGGIO",
-- ParseError (dtsc.mon_desc_errore_siu) "Tipo errore",
REPLACE (REGEXP_REPLACE (dtsc.mon_desc_errore_siu,
'
- StackTrace
.*',
'',
1,
0,
'imn'),
'
',
' ')
"Errore",
dtsc.IDDE_IDENTIF_DATI_EXT_ID
FROM SIUINTEGRA.ENI_TAVOLO_ETL_DETT DTSC
WHERE 1 = 1
AND DTSC.DTSC_TAVOLO_DETT_ID = DTSC.DTSC_STORICO_ID
AND DTSC.DTSC_DATA_FIN = TO_TIMESTAMP ('31-DIC-9999 00:00:00')
--
AND dtsc.tipo_processo_cod IN
('CC',
'NUOVA_ATT_ENI',
'VOLTURA_ATT',
'VOLTURA_ENI',
'AT',
'VT',
'CC_POWER',
'VOLTURA_ATT_PWR')
AND EXISTS
(SELECT 1
FROM NETATEMP.TMP_BACKLOG_NOBILLING2013_UFF p
WHERE p.id_messaggio = DTSC.id_messaggio);
文本格式的计划
Plan
SELECT STATEMENT ALL_ROWSCost: 205 Bytes: 758 Cardinality: 1 CPU Cost: 82.337.155 IO Cost: 199 Time: 3
2 TABLE ACCESS BY INDEX ROWID TABLE SIUETL.ETL_ELAB_INTERF_FLAT Object Instance: 1 Filter Predicates: "F1"."EIF_CAMPO198"=:B1 AND "F1"."EIF_CAMPO200"='FORNITURA_ENI' AND "F1"."EIF_CAMPO29"='Nuovo' Cost: 6 Bytes: 27 Cardinality: 1 CPU Cost: 103.802 IO Cost: 6 Time: 1
1 INDEX RANGE SCAN INDEX SIUETL.ETL_EIF_FK_IDX4 Search Columns: 1 Access Predicates: "F1"."IDDE_IDENTIF_DATI_EXT_ID"=:B1 Cost: 4 Cardinality: 9 CPU Cost: 40.772 IO Cost: 4 Time: 1
4 TABLE ACCESS BY INDEX ROWID TABLE SIUINTEGRA.ENI_FLUSSI_HUB Object Instance: 2 Filter Predicates: "C"."IDDE_IDENTIF_DATI_EXT_ID"=:B1 Cost: 4 Bytes: 21 Cardinality: 1 CPU Cost: 40.070 IO Cost: 4 Time: 1
3 INDEX RANGE SCAN INDEX SIUINTEGRA.ENI_FLH_IDX6 Search Columns: 1 Access Predicates: "C"."FLH_ID_MESSAGGIO"=:B1 Cost: 3 Cardinality: 1 CPU Cost: 29.429 IO Cost: 3 Time: 1
12 HASH UNIQUE Cost: 205 Bytes: 758 Cardinality: 1 CPU Cost: 82.337.155 IO Cost: 199 Time: 3
11 NESTED LOOPS
9 NESTED LOOPS Cost: 204 Bytes: 758 Cardinality: 1 CPU Cost: 69.141.535 IO Cost: 199 Time: 3
6 SORT UNIQUE Cost: 35 Bytes: 611.020 Cardinality: 61.102 CPU Cost: 8.113.248 IO Cost: 34 Time: 1
5 INDEX FAST FULL SCAN INDEX NETATEMP.TMP_BACKLOG_NOBILLING2013_UFF2 Cost: 35 Bytes: 611.020 Cardinality: 61.102 CPU Cost: 8.113.248 IO Cost: 34 Time: 1
8 INLIST ITERATOR
7 INDEX RANGE SCAN INDEX SIUINTEGRA.ENI_DTSC_UK4_IDX Search Columns: 2 Access Predicates: "P"."ID_MESSAGGIO"="DTSC"."ID_MESSAGGIO" AND ("DTSC"."TIPO_PROCESSO_COD"='AT' OR "DTSC"."TIPO_PROCESSO_COD"='CC' OR "DTSC"."TIPO_PROCESSO_COD"='CC_POWER' OR "DTSC"."TIPO_PROCESSO_COD"='NUOVA_ATT_ENI' OR "DTSC"."TIPO_PROCESSO_COD"='VOLTURA_ATT' OR "DTSC"."TIPO_PROCESSO_COD"='VOLTURA_ATT_PWR' OR "DTSC"."TIPO_PROCESSO_COD"='VOLTURA_ENI' OR "DTSC"."TIPO_PROCESSO_COD"='VT') Cost: 9 Cardinality: 1 CPU Cost: 162.886 IO Cost: 9 Time: 1
10 TABLE ACCESS BY INDEX ROWID TABLE SIUINTEGRA.ENI_TAVOLO_ETL_DETT Object Instance: 3 Filter Predicates: "DTSC"."DTSC_TAVOLO_DETT_ID"="DTSC"."DTSC_STORICO_ID" AND "DTSC"."DTSC_DATA_FIN"=TO_TIMESTAMP('31-DIC-9999 00:00:00') Cost: 10 Bytes: 748 Cardinality: 1 CPU Cost: 173.206 IO Cost: 10 Time: 1
【问题讨论】:
-
您确定以下列没有索引 f1.idde_identif_dati_ext_id 吗?检查 etl_elab_interf_flat 表的定义,该计划指示似乎是称为 ETL_EIF_FK_IDX4 的外键索引。基本上,计划表明子选择将首先针对 ENI_TAVOLO_ETL_DETT 表运行,然后再应用剩余的谓词
-
是的。 FK idde_identif_dati_ext_id 中的字段在 etl_elab_interf_flat 上有索引。但我不明白为什么它说它首先使用该索引。当它做的第一件事应该是阅读 ENI_TAVOLO_ETL_DETT
-
@Sam 似乎应该以稍微不同的方式解释执行计划,以防您的查询中有标量子查询。前段时间我有完全相同的问题,令人惊讶的是,即使在 MOS 上,我也找不到任何官方解释。可能我看起来不够努力。
-
您能否发布您的 DDL 以便我们进行模拟?
-
你能打印出计划的文本版本,由 DBMS_Xplan.display() 输出吗?
标签: performance oracle