OVH Cloud OVH Cloud

Performance dans update entre 2000 et 6.5

1 réponse
Avatar
Laurent RUHLMANN
Bonjour,

Je fais un update sur une table FRAIS qui déclenche un trigger dans le quel
se trouve la requête suivante :

UPDATE FRAIS_MOIS
SET frm_mtn = frm_mtn - d.fra_mtn +
i.fra_mtn,
frm_mtn_dev_sap = frm_mtn_dev_sap - d.fra_mtn_dev_sap +
i.fra_mtn_dev_sap

FROM deleted d JOIN inserted i
ON d.fra_tie_c_sap = i.fra_tie_c_sap
AND d.fra_c_aa = i.fra_c_aa
AND d.fra_art_c = i.fra_art_c
AND d.fra_ctr_suf = i.fra_ctr_suf
AND d.fra_cde_suf = i.fra_cde_suf
AND d.fra_es_suf = i.fra_es_suf
AND d.fra_tie_c_pai = i.fra_tie_c_pai
AND d.fra_dev_c = i.fra_dev_c
AND d.fra_rub_c = i.fra_rub_c

WHERE frm_aa = DatePart (yy, i.fra_d_val)
AND frm_mm = DatePart (mm, i.fra_d_val)
AND frm_tie_c_sap = i.fra_tie_c_sap
AND frm_c_aa = i.fra_c_aa
AND frm_art_c = i.fra_art_c
AND frm_ctr_suf = i.fra_ctr_suf
AND frm_cde_suf = i.fra_cde_suf
AND frm_es_suf = i.fra_es_suf
AND frm_tie_c_pai = i.fra_tie_c_pai
AND frm_dev_c = i.fra_dev_c
AND frm_rub_c = i.fra_rub_c



Le problème est que j'obtiens des performances bcp moins intéressante en
Compatibilité 2000 qu' en compatibilité 6.5. Le plan d'exécution est
différent :
dans le cas 2000 il parcourt l'index PK_FRAIS_MOIS en entier et réalise un
Hash Match avec deleted (très couteux !), alors qu'en 6.5 il cherche
directement
les lignes inserted dans la table FRAIS_MOIS en utilisant l'index !! D'un
côté j'ai le résultat en 6-7 sec, et de l'autre en moins d'une seconde !!

Conseils ??

Laurent

1 réponse

Avatar
Fred BROUARD
je comprend absolument pas pourquoi tu utilise deleted combiné à inserted !

peut tu poster le code tout entier de ce trigger ???

A +

Laurent RUHLMANN a écrit:
Bonjour,

Je fais un update sur une table FRAIS qui déclenche un trigger dans le quel
se trouve la requête suivante :

UPDATE FRAIS_MOIS
SET frm_mtn = frm_mtn - d.fra_mtn +
i.fra_mtn,
frm_mtn_dev_sap = frm_mtn_dev_sap - d.fra_mtn_dev_sap +
i.fra_mtn_dev_sap

FROM deleted d JOIN inserted i
ON d.fra_tie_c_sap = i.fra_tie_c_sap
AND d.fra_c_aa = i.fra_c_aa
AND d.fra_art_c = i.fra_art_c
AND d.fra_ctr_suf = i.fra_ctr_suf
AND d.fra_cde_suf = i.fra_cde_suf
AND d.fra_es_suf = i.fra_es_suf
AND d.fra_tie_c_pai = i.fra_tie_c_pai
AND d.fra_dev_c = i.fra_dev_c
AND d.fra_rub_c = i.fra_rub_c

WHERE frm_aa = DatePart (yy, i.fra_d_val)
AND frm_mm = DatePart (mm, i.fra_d_val)
AND frm_tie_c_sap = i.fra_tie_c_sap
AND frm_c_aa = i.fra_c_aa
AND frm_art_c = i.fra_art_c
AND frm_ctr_suf = i.fra_ctr_suf
AND frm_cde_suf = i.fra_cde_suf
AND frm_es_suf = i.fra_es_suf
AND frm_tie_c_pai = i.fra_tie_c_pai
AND frm_dev_c = i.fra_dev_c
AND frm_rub_c = i.fra_rub_c



Le problème est que j'obtiens des performances bcp moins intéressante en
Compatibilité 2000 qu' en compatibilité 6.5. Le plan d'exécution est
différent :
dans le cas 2000 il parcourt l'index PK_FRAIS_MOIS en entier et réalise un
Hash Match avec deleted (très couteux !), alors qu'en 6.5 il cherche
directement
les lignes inserted dans la table FRAIS_MOIS en utilisant l'index !! D'un
côté j'ai le résultat en 6-7 sec, et de l'autre en moins d'une seconde !!

Conseils ??

Laurent






--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************