Bonjour,
voila j'ai une question simple :
Est-ce que les curseurs prennent en compte les index dans leurs exécutions ou bien font-ils des scans simples de la table par défaut ?
j'ai eu l'occasion ces derniers jours de mesurer le temps d'exécution d'un curseur C1 défini comme suit :
J’ai opté pour une stratégie de chargement par bloc. mon fetch ressemble donc à ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DECLARE c_classical_query CURSOR FOR SELECT id_ville, taux_crim, temp_ann FROM ville WHERE (pop between 50000 AND 100000) FOR READ ONLY;
Où SIZE_BUFFER_ est la taille du block et row_set une structure de données destinée à contenir le bloque retourné.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 FETCH FORWARD :SIZE_BUFFER_ FROM c_classical_query INTO :row_set;
J’ai d'abord mesuré le temps d'exécution de mon programme écrit en ECPG sans index sur le champ pop, puis avec un index de type b-tree.
À mon grand étonnement, j'ai eu les mêmes temps d'exécution.
J’ai bien vérifié que l'index est pris en compte pour la requête définissant le curseur(SELECT id_ville, ...). Et pourtant, le curseur s'obstine à faire des scans séquentiels malgré l'existence de l'index.
J’ai cherché sur internet des explications, mais rien n'ai fait.
merci d'avance.
Partager