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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT * FROM MAGROSSETABLE a WHERE a.IdRegroupeOption=347696871
1 ligne

Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT * FROMMAGROSSETABLE a WHERE a.Id=347696871
1 ligne (la même dans ce cas particulier)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT * FROM MAGROSSETABLE a WHERE a.IdRegroupeOption=347696871 OR a.Id=347696871
devrait renvoyer 1 ligne ... mais je l'attends toujours

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.