Bonjour à tous
Nous avons en production une problematique d'application qui tombe en abend en raison d'une requête lancée sur le DB2 mainframe qui ne répond pas en temps voulu car très peu performante.
La situation:
Une table T1 3 millions de lignes avec 20 colonnes toutes valorisees.
Une table T2 2500 lignes avec 5 colonnes toutes valorisees sauf la Col2 qui n'est valorisée que pour 3 occurences.
Requete:
SELECT * FROM T2, T1
WHERE T2.COL2= T1.COL1
AND T2.COL1= 'numero d'abonné'
AND T1.COL2 <> 'm'
AND T1.COL1 > 'numero de contrat' (pour le repositionnement).
Indexs:
XT1 COL1. Cluster.
XT2 COL1 COL2 cluster.
Lors de l'exécution de la requête T2.COL2 est toujours valorisé donc on devrait théoriquement entrer par le numéro d'abonné pour lequel nois avons besoin de vérifier que celui ci est bien connu en base personne.
On devrait donc avoit un accès du genre:
Meth 0 sur T2 via XT2 mc 2
Meth 1 sur T1 via XT1 mc 1
Car on entre par la clé de la plus petite table qui est discriminante.
Mais non c'est quasi l'inverse qui se produit...
Meth 0 sur T1 via XT1 mc 1 sequential prefetch
Meth 1 sur T2 via XT2 mc 1
Runstats et reorg passés.
Résultat la requête est fortement consommatrice et l'application tombe alors en erreur a cause de cela(traces posées qui ont confirmé le diagnostic)
Si l'on force le passage par l'index de T2 voulu la requete fonctionne alors de façon optimale et repond.
Une piste?
Merci.
Partager