IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Curseur + index


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 199
    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 : 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;
    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
     
    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.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 199
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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. !!!

Discussions similaires

  1. récupere l'index du curseur datagridview
    Par Gregney dans le forum VB.NET
    Réponses: 7
    Dernier message: 25/02/2011, 00h09
  2. récupérer l'index du curseur avant l'évennement ontextchange
    Par TaymouWan dans le forum Windows Forms
    Réponses: 4
    Dernier message: 11/05/2009, 15h58
  3. Index du curseur dans un input type=text
    Par antonus dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/09/2005, 17h52
  4. Comment récupérer l'index du curseur dans une TStringGrid ?
    Par Sydaze dans le forum Composants VCL
    Réponses: 2
    Dernier message: 26/04/2005, 09h17
  5. Position du curseur dans Edit
    Par MrJéjé dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/06/2002, 17h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo