Bonjour,
Pour résumer j'ai donc placé des statistiques importantes sur les colonnes les plus utilisées :
1 2 3 4 5 6
| ALTER TABLE monschema.matable ALTER COLUMN col1 SET STATISTICS 1000;
ALTER TABLE monschema.matable ALTER COLUMN col2 SET STATISTICS 100;
ALTER TABLE monschema.matable ALTER COLUMN col3 SET STATISTICS 100;
ALTER TABLE monschema.matable ALTER COLUMN col4 SET STATISTICS 100;
ALTER TABLE monschema.matable ALTER COLUMN codesite SET STATISTICS 1000;
ALTER TABLE monschema.matable ALTER COLUMN base SET STATISTICS 1000; |
Il faut ajouter à ceci une contrainte d'unicité uk_matable_col2_datecreation sur (col2,datecreation).
Puis j'ai mis mes index comme suit :
1 2 3 4 5 6
|
CREATE INDEX "idx_matable_col1" ON "monschema"."matable" USING btree ("col1");
CREATE INDEX "idx_matable_col1_complexe" ON "monschema"."matable" USING btree ("col1", "codesite", "base");
CREATE INDEX "idx_matable_col2_complexe" ON "monschema"."matable" USING btree ("col2", "codesite", "base");
CREATE INDEX "idx_matable_col3_complexe" ON "monschema"."matable" USING btree ("col3", "codesite", "base");
CREATE INDEX "idx_matable_col4_complexe" ON "monschema"."matable" USING btree ("col4", "codesite", "base"); |
Pour deux types de requêtes utilisées :
- requête pour la recherche :
SELECT * FROM monschema.matable WHERE colx like 'unevaleur%' AND codesite in ('004') AND base IN ('E', 'A') ORDER BY datecreation DESC LIMIT 150
où colx peut être : col1, col2, col3 ou col4
où base peut être : ('E') ou ('A') ou ('E', 'A')
où codesite peut être une liste ou pas d'une dizaine de valeur de type 'XXX'
Sachant que la valeur la plus complexe à rechercher est col1.
- requête pour afficher un résultat :
SELECT * FROM monschema.matable WHERE col2='mavaleur' AND datecreation='20060401'
car col2 et datecreation est une clé unique
J'ai de bonne performances : je suis passé à environ 8s sur la première recherche de termes complexes.
Cela vous parait-il normal ?
Partager