Bonjour,
J’ai un problème avec une requête paramétrée qui utilise par moment l’index de PK et d’autrefois non.
J’ai une table de 15 000 000 d’enregistrements de 500 colonnes en Sybase.
La clé primaire est composée de 5 champs. La première colonne de la Pk est celle où il y a le plus de valeurs distinctes ( environ 150 000 ), les autres champs qui composent la clé n’ont pas plus de 100 valeurs distinctes.

J’ai créé une boucle qui paramètre une requête sur la colonne 1 de la PK. Il Elle prend des intervalles de valeurs de 2 ou 3000 valeurs à chaque fois.
La requête est simple dans le sens où c’est un select de 50 champs sur celle seule table.
Ex :
Table_Syb avec PK col1 asc, col2 asc, col3 asc, col4 asc, col5 asc

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Select col1, col2…col50 
From Table_Syb
Where col1 between 0 and 1999
….
Boucle suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Select col1, col2…col50 
From Table_Syb
Where col1 between  2000 and 4000
Chaque boucle retourne un nombre différent de lignes mais ramène entre 50 000 et 1 500 000 lignes.

Sur certaines boucles, l’index de PK est utilisé, sur d’autres il ne l’est pas, il fait un table scan.
Depuis quelques temps, le traitement fonctionne de cette manière mais avant il fonctionnait très bien en utilisant systématiquement l’index de la PK.
Entre ces 2 moments, il y a eu une insertion de 300 000 lignes dans la table.

Le seul moyen que j’ai trouvé pour qu’il utilise l’index à chaque requête, c’est de spécifier tous les champs de la clé comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
Select col1, col2…col50 
From Table_Syb
Where col1 between 0 and 1999
And col2 between 1 and 100
And col3 between 1 and 100
And col4 between 1 and 100
And col5 between 1 and 100
 
….
Boucle suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
Select col1, col2…col50 
From Table_Syb
Where col1 between  2000 and 4000
And col2 between 1 and 100
And col3 between 1 and 100
And col4 between 1 and 100
And col5 between 1 and 100

Quelqu’un a-t-il déjà rencontré cela ? Est-ce un comportement normal ? et dans le cas contraire quelqu’un a-t-il une solution plus propre ou à une piste à tester?

Merci d'avance de vos réponses.