Bonjour,
J'aurai une question concernant l'optimisation de requête sous oracle. J'aimerai optimiser le temps d'exécution d'une requête mais malgré mes certaines modifications soit disant qui devrait raccourcir le temps d'exécution, il reste inchangé et le plan d'exécution pour les 2 requêtes écrites différement est le même. voici les 2 requêtes :
Requête d'origine :
Requête modifiée :SELECT
to_char(E.DT_PHYSIQUE, 'dd/mm/yyyy') DT_SYNTHESE,
to_char(E.DT_PHYSIQUE, 'yyyy') || to_char(E.DT_PHYSIQUE, 'mm') || to_char(E.DT_PHYSIQUE, 'dd') ID_TEMPS,
E.DATAAREAID_MVT_STOCK AS DATAAREAID,
ELM_ORDRE_FAB.CD_POSTE_CHARGE,
(E.QUANTITE*UNIT_CONVERT.FACTOR) as QTE_EMBALLEE_SACHETS,
E.CD_ENTREPOT
FROM
ELM_MVT_STOCK E,
ELM_ORDRE_FAB,
UNIT_CONVERT
WHERE
to_char(E.CD_TYPE_TRANS) IN (SELECT FIELD_VALUE FROM PARAMETRE WHERE TYPE_PARAMETRE='TYPE_TRANS_PRODUCTION')
AND E.CD_ENTREPOT IN (SELECT FIELD_VALUE FROM PARAMETRE WHERE TYPE_PARAMETRE='ENTREPOT_5')
AND E.DATAAREAID_MVT_STOCK = UPPER(UNIT_CONVERT.DATAAREAID)
AND E.DATAAREAID_MVT_STOCK = ELM_ORDRE_FAB.DATAAREAID_OF
AND E.NUM_REFERENCE = ELM_ORDRE_FAB.NUM_OF
AND UNIT_CONVERT.FROMUNIT = 'EA'
AND UNIT_CONVERT.TOUNIT = 'BOX'
AND E.ID_ARTICLE = UNIT_CONVERT.ITEMID
AND to_date(to_char(E.DT_PHYSIQUE, 'mm/yyyy'), 'mm/yyyy') >= to_date(to_char(ADD_MONTHS (SYSDATE,-1), 'mm/yyyy'), 'mm/yyyy')
j'ai l'habitude de travailler sur SQL Server et la j'attaque pour la première fois une base Oracle, je sais qu'il interprète le code différement mais comment, malgré ma recherche sur quelques forum je ne vois pas trop.SELECT
to_char(EMS.DT_PHYSIQUE, 'dd/mm/yyyy') DT_SYNTHESE,
to_char(EMS.DT_PHYSIQUE, 'yyyy') || to_char(EMS.DT_PHYSIQUE, 'mm') || to_char(EMS.DT_PHYSIQUE, 'dd') ID_TEMPS,
EMS.DATAAREAID_MVT_STOCK AS DATAAREAID,
EOF.CD_POSTE_CHARGE,
(EMS.QUANTITE*UCT.FACTOR) as QTE_EMBALLEE_SACHETS,
EMS.CD_ENTREPOT
FROM
ELM_MVT_STOCK EMS
INNER JOIN ELM_ORDRE_FAB EOF ON EOF.NUM_OF = EMS.NUM_PREFERENCE AND EOF.DATAAREAID_OF = EMS.DATAAREAID_MVT_STOCK
INNER JOIN UNIT_CONVERT UCT ON UCT.ITEMID = EMS.ID_ARTICLE AND UCT.FROMUNIT = 'EA' AND UCT.TOUNIT = 'BOX' AND UPPER(UCT.DATAAREAID) = EMS.DATAAREAID_MVT_STOCK
WHERE
to_date(to_char(EMS.DT_PHYSIQUE, 'mm/yyyy'), 'mm/yyyy') >= to_date(to_char(ADD_MONTHS (SYSDATE,-1), 'mm/yyyy'), 'mm/yyyy')
AND
EXISTS(SELECT FIELD_VALUE FROM PARAMETRE WHERE TYPE_PARAMETRE='TYPE_TRANS_PRODUCTION' AND FIELD_VALUE = to_char(EMS.CD_TYPE_TRANS))
AND
EXISTS(SELECT FIELD_VALUE FROM PARAMETRE WHERE TYPE_PARAMETRE='ENTREPOT_5 AND FIELD_VALUE = EMS.CD_ENTREPOT)
AND
to_date(to_char(EMS.DT_PHYSIQUE, 'mm/yyyy'), 'mm/yyyy') >= to_date(to_char(ADD_MONTHS (SYSDATE,-1), 'mm/yyyy'), 'mm/yyyy')
Si vous pouvez m'aiguillé
merci.
Le plus important c'est la table ELM_MVT_STOCK qui retourne environ 997000 lignes, pour environ 2min30 d'exécution ... !!
Partager