Oracle SQL qui doit être accordée:Oracle - que peut-on faire pour supprimer Full Table Scan/Table Access Full?
SELECT mcei.mcei_sid
FROM MA_CE mc
JOIN MA_CE_EN mce
ON mc.mc_id=mce.mc_cd
JOIN MA_CE_EN_IN mcei
ON mce.mce_sid =mcei.mce_sid
WHERE mc.active_flag = 'Y'
AND mce.active_flag = 'Y'
AND Mcei.Latest_Full_Run_Flag = 'Y'
AND Mcei.Engine_Type_Cg_Sid = GE_CG_SI_FR_C_SN ('MEI_ENGTYPE','COB')
AND Mcei.Mcei_State_Cg_Sid = GE_CG_SI_FR_C_SN ('MCEI_STATE','COMPLETED')
AND Mc.Mc_Id = NVL(6,Mc.Mc_Id)
AND mcei.business_dt = NVL(NULL -- this is a parameter which could be NULL or a Date
,
(SELECT mcei.business_dt
FROM MA_CE_EN e
WHERE e.current_cob_mei_sid =mcei.mcei_sid
AND e.active_flag ='Y'
AND mcei.Latest_Full_Run_Flag='Y'
AND e.mce_sid =mce.mce_sid
));
Expliquer le plan:
----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 40 | 825 (2)| 00:00:10 |
|* 1 | FILTER | | | | | |
|* 2 | HASH JOIN | | 376 | 15040 | 636 (3)| 00:00:08 |
| 3 | NESTED LOOPS | | 1 | 14 | 4 (0)| 00:00:01 |
|* 4 | TABLE ACCESS BY INDEX ROWID| MA_CE | 1 | 5 | 1 (0)| 00:00:01 |
|* 5 | INDEX UNIQUE SCAN | IPK_MA_CE | 1 | | 0 (0)| 00:00:01 |
|* 6 | TABLE ACCESS FULL | MA_CE_EN | 1 | 9 | 3 (0)| 00:00:01 |
|* 7 | TABLE ACCESS FULL | MA_CE_EN_IN | 4817 | 122K| 632 (3)| 00:00:08 |
|* 8 | FILTER | | | | | |
|* 9 | TABLE ACCESS BY INDEX ROWID | MA_CE_EN | 1 | 11 | 1 (0)| 00:00:01 |
|* 10 | INDEX UNIQUE SCAN | IPK_MCENG | 1 | | 0 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------
prédicats information (identifié par id opération):
---------------------------------------------------
1 - filter("MCEI"."BUSINESS_DT"= (SELECT :B1 FROM "MA_CE_EN" "E" WHERE :B2='Y' AND
"E"."MCE_SID"=:B3 AND "E"."CURRENT_COB_MEI_SID"=:B4 AND "E"."ACTIVE_FLAG"='Y'))
2 - access("MCE"."MCE_SID"="MCEI"."MCE_SID")
4 - filter("MC"."ACTIVE_FLAG"='Y')
5 - access("MC"."MC_ID"=6)
6 - filter("MCE"."ACTIVE_FLAG"='Y' AND "MC"."MC_ID"="MCE"."MC_CD")
7 - filter("MCEI"."LATEST_FULL_RUN_FLAG"='Y' AND
"MCEI"."MCEI_STATE_CG_SID"="GE_CG_SI_FR_C_SN"('MCEI_STATE','COMPLETED') AND
"MCEI"."ENGINE_TYPE_CG_SID"="GE_CG_SI_FR_C_SN"('MEI_ENGTYPE','COB'))
8 - filter(:B1='Y')
9 - filter("E"."CURRENT_COB_MEI_SID"=:B1 AND "E"."ACTIVE_FLAG"='Y')
10 - access("E"."MCE_SID"=:B1)
---------------------------------------------------
Nombre de lignes dans la 3 tables utilisées dans la requête:
ma_ce - 10
ma_ce_en - 10
ma_ce_en_in - 160000
(ma_ce_en_in table est coupable. Clé primaire sur les colonnes MCEI_SID et MCEI_SID_SEQ. Aucun autre index sur cette table)
Question 1 -. Je veux régler la requête, donc je ne veux pas complète Table de numérisation (ou table Full Access) sur ma_ce_en_in car cela est la seule grande table. Que peut-on faire pour supprimer l'analyse de table complète de cette table?
Question 2 - La requête ci-dessus est présente dans une fonction, comment trouver combien de fois la fonction s'exécute dans une semaine?
Je ne suis pas très sûr de ce qu'est FTS? –
L'analyse complète de la table OU l'accès à la table est complet. Edité ma question aussi. –
Apparemment, Oracle est complètement sous-estimer le nombre de lignes dans 'ma_ce_en_in'. Vos statistiques sont-elles à jour? –