Bonjour,
J'ai une requête (qui était déjà pas bien rapide) qui est devenue totalement inutilisable.
J'ai identifié quelle partie coince :
Tables impliquées :
EVE
=> INDEX UNIQUE sur (CODSOC, ACHVTE, TYPEVE, NUMEVE)
EVL
=> INDEX UNIQUE sur (CODSOC, ACHVTE, TYPEVE, NUMEVE, NUMPOS, NUMLIG)
PRO
=> INDEX UNIQUE SUR (CODSOC, CODPRO)
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 select * from eve inner join evl on evl.codsoc = eve.codsoc and evl.achvte = eve.achvte and evl.typeve = eve.typeve and evl.numeve = eve.numeve inner join pro on pro.codsoc = 1 and pro.codpro = evl.codpro where eve.codsoc = 8001 and eve.achvte = 'A' and eve.typeve = 'PLA'
Sur le serveur de DEV, cette requête fait un RANGE SCAN sur les index uniques de EVE et EVL, et un UNIQUE SCAN sur PRO, pour un coût de 167. La requête est instantanée (moins de 0,1 seconde)
Sur le serveur de REC, cette requête fait un RANGE SCAN sur les index uniques de EVE et EVL, mais un FAST FULL SCAN sur PRO, pour un coût de plus de 90000. J'ai stoppé la requête au bout de 5 minutes.
Les index sont les mêmes sur les deux serveurs, même version (c'est deux instance sur un même serveur).
La volumétrie est cependant passablement différente :
DEV :
- EVE : 30 383
- EVL : 67 970
- PRO : 136 419
REC :
- EVE : 25 015 883
- EVL : 84 233 838
- PRO : 428 292
Ok, des rapports de 1 pour 1000, c'est loin d'être anodin.
Mais pourquoi passer d'un UNIQUE SCAN à un FAST FULL SCAN ?
Si j'enlève la jointure sur PRO, la requête est immédiate. La requête retourne alors moins de 50 lignes. Comment 50 lectures sur PRO, en se basant sur un INDEX UNIQUE peuvent être aussi lentes ?
Partager