Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/07/2008, 01h32   #1
Membre du Club
 
Inscription : février 2004
Messages : 197
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 197
Points : 57
Points : 57
Envoyer un message via MSN à subzero82 Envoyer un message via Yahoo à subzero82 Envoyer un message via Skype™ à subzero82
Par défaut Curseur + index

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 :
Code :
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;
J’ai opté pour une stratégie de chargement par bloc. mon fetch ressemble donc à ceci:
Code :
1
2
 
FETCH FORWARD :SIZE_BUFFER_ FROM c_classical_query INTO :row_set;
Où SIZE_BUFFER_ est la taille du block et row_set une structure de données destinée à contenir le bloque retourné.

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.
subzero82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 12h28   #2
Membre du Club
 
Inscription : février 2004
Messages : 197
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 197
Points : 57
Points : 57
Envoyer un message via MSN à subzero82 Envoyer un message via Yahoo à subzero82 Envoyer un message via Skype™ à subzero82
re,

j'ai passé mon curseur sous la moulinette et j'ai pue comprendre un peu (mais pas tout).

j'ai d'abord pris la déclaration de mon curseur et l'ai fais passer sous la commande EXPLAIN.

mon curseur est définit comme suis (j'ai rajouté un critere par rapport à mon dernier poste):
Code :
1
2
3
 
DECLARE c_classical_query CURSOR FOR SELECT id_ville, taux_crim, temp_ann FROM ville WHERE (pop BETWEEN 50000 AND 100000) FOR READ ONLY;DECLARE c_classical_query CURSOR FOR SELECT id_ville, taux_crim, temp_ann FROM ville WHERE (pop BETWEEN 50000 AND 100000) AND 
(taux_crim BETWEEN 13 AND 16);
et voila ce que me retourne EXPLAIN comme plan d'execution:
Code :
1
2
3
 
"Seq Scan on ville  (cost=0.00..2531.00 rows=6863 width=12)"
	"  Filter: ((pop >= 50000) AND (pop <= 100000))"
en reprenant juste la requete select définissant le curseur, le plan d'execution est tout autres il utilise l'index existant !!!.
Code :
1
2
3
4
5
6
7
 
"Bitmap Heap Scan on ville  (cost=253.82..1551.48 rows=915 width=12) (actual time=4.142..17.580 rows=1309 loops=1)"
"  Recheck Cond: ((taux_crim >= 13) AND (taux_crim <= 16))"
"  Filter: ((pop >= 50000) AND (pop <= 100000))"
"  ->  Bitmap Index Scan on taux_crim_idx  (cost=0.00..253.59 rows=13333 width=0) (actual time=3.746..3.746 rows=13381 loops=1)"
"        Index Cond: ((taux_crim >= 13) AND (taux_crim <= 16))"
"Total runtime: 20.599 ms"
Il semblerait que les curseurs soit plus restrictive quand à l'utilisation des index. mais pourquoi ?

pourquoi quand un index peut accélérer le temps de réponse de la requête le définissant est utilisé quand cette dernière est utilisé en dehors d'un curseur et non avec un curseur. !!!
subzero82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h39.


 
 
 
 
Partenaires

Hébergement Web