Vous n'êtes pas identifié(e).

#1 21/09/2011 16:49:05

Julien
Membre

Problème index

Bonjour,

J'ai un problème pour faire un index sur une table de ma bdd.

Structure de ma table :

table y {
id bigint NOT NULL,
y_principal bigint,
issupprime boolean,
....
CONSTRAINT y_pkey PRIMARY KEY (id)
}

Je voudrais faire un index regroupant les y lors que y_principal est null et issupprime est égale à false mais je n'y arrive pas. Cette index servirai pour la requête :

SELECT  * FROM y WHERE y_principal is not null AND issupprime = false.

Merci d'avance pour votre aide.

Cordialement

Julien

Hors ligne

#2 21/09/2011 17:03:28

gleu
Administrateur

Re : Problème index

Il y a plusieurs façon de créer un tel index : un index complet et un index partiel. Le premier s'écrit ainsi : CREATE INDEX i ON y (y_principal, issupprime);. Le second pourrait s'écrire : CREATE INDEX i ON y (y_principal) WHERE issupprime=false;. Il pourrait s'écrire de plein d'autres façon. Mais de toute façon, ça n'a d'intérêt que si la majorité des valeurs de la colonne y_principal est NULL et que la majorité des valeurs de la colonne issuprime est true.


Guillaume.

Hors ligne

#3 21/09/2011 17:12:09

Julien
Membre

Re : Problème index

En effet la majorité de la colonne y_principal est null mais par contre la majorité de la colonne issuprime est a false il faut donc utiliser uniquement la colonne y_principal dans l'index ? Mon problème est en faite que la requête est longue et je pensai mettre cette index pour résoudre ce problème.

Et j'ai déjà essayé d'écrire les index de cette façon mais en faisant un EXPLAIN le traitement reste en séquentielle et n'utilise pas l'index. Désolé mais je suis en pleine galère je débute.

Dernière modification par Julien (21/09/2011 17:21:46)

Hors ligne

#4 21/09/2011 17:35:08

Julien
Membre

Re : Problème index

Le deuxième index : CREATE INDEX i ON y (y_principal) WHERE issupprime=false, fonctionne si je met une valeur définie à y_principal mais pas si je met is null

Dernière modification par Julien (21/09/2011 17:35:36)

Hors ligne

#5 21/09/2011 17:38:01

gleu
Administrateur

Re : Problème index

Par "fonctionne", je suppose que vous voulez dire "est utilisé". Et ça peut être tout à fait normal. PostgreSQL n'utilise un index que si les statistiques sur les données lui conseillent de le faire. Autrement dit, si vous avez une majorité de valeurs NULL, il n'y a aucun intérêt à utiliser cet index.


Guillaume.

Hors ligne

#6 21/09/2011 17:44:49

Julien
Membre

Re : Problème index

Oui je veux dire est utilisé et sachant que 390000 enregistrement est a null sur 410000 la majorité est donc à null...

Hors ligne

#7 21/09/2011 20:47:40

gleu
Administrateur

Re : Problème index

Dans ce cas, aucun index sur y_principal ne portera ses fruits pour cette requête. Concentrez-vous plutôt sur issupprime (à condition là-aussi que la majorité de issupprime corresponde à la valeur true.


Guillaume.

Hors ligne

Pied de page des forums