Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
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
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
Oui je veux dire est utilisé et sachant que 390000 enregistrement est a null sur 410000 la majorité est donc à null...
Hors ligne
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
Pages : 1