Bonjour,
Je rencontre des problèmes de performance pour accéder aux données d'une table et je ne parviens pas a comprendre ce qu'il se passe, ni comment résoudre le problème.
La situation :
J'ai une table de 270 millions d'enregistrements contenant diverses informations dont les champs
- Id : primary key
- IdRegroupeOption : un Id de regroupement (0 sur toutes les lignes sauf une)
Les deux champs ci-dessus disposent d'un index, non-unique dans le cas du 2eme champ
La table a été réorganisée, les indexes aussi et le runstats a été fait
Le problème :
Les requêtes suivantes s'exécutent en quelques millisecondes :
SELECT * FROM MAGROSSETABLE a WHERE a.IdRegroupeOption=347696871
1 ligne
SELECT * FROMMAGROSSETABLE a WHERE a.Id=347696871
1 ligne (la même dans ce cas particulier)
1 2 3
| SELECT * FROM MAGROSSETABLE a WHERE a.IdRegroupeOption=347696871
UNION ALL
SELECT * FROM MAGROSSETABLE a WHERE a.Id= 347696871 |
2 fois la même ligne
Par contre les requêtes suivantes mettent une éternité à s'exécuter (j'ai killé après 5 minutes de temps perdu) :
SELECT * FROM MAGROSSETABLE a WHERE a.IdRegroupeOption=347696871 OR a.Id=347696871
devrait renvoyer 1 ligne ... mais je l'attends toujours
1 2 3
| SELECT * FROM MAGROSSETABLE a WHERE a.IdRegroupeOption=347696871
UNION
SELECT * FROM MAGROSSETABLE a WHERE a.Id=347696871 |
devrait renvoyer 1 ligne ... mais je l'attends toujours
1 2 3 4 5 6
|
SELECT DISTINCT * FROM (
SELECT * FROM MAGROSSETABLE a WHERE a.IdRegroupeOption = 347696871
UNION ALL
SELECT * FROM MAGROSSETABLE a WHERE a.Id = 347696871
) AS req |
devrait renvoyer 1 ligne ... mais je l'attends toujours
Je ne comprends pas pourquoi DB2 part en TABLESCAN dès que je combine mes 2 critères au lieu d'utiliser les indexes, que ce soit via un UNION ou un OR ?!
Est-ce que l'un d'entre vous aurait des pistes ?
Merci d'avance pour votre aide.
Partager