Bonjour,

Voici la structure de ma table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
CREATE SEQUENCE "monschema"."seq_matable_id" INCREMENT 1  MINVALUE 1 MAXVALUE 9223372036854775807  START 1 CACHE 1;
 
-- Ajout table : matable
CREATE TABLE "monschema"."matable"
(
	id bigint NOT NULL DEFAULT NEXTVAL('consult.seq_matable_id'),
	col1 character(12) NOT NULL,
	col2 character varying(14) NULL,
	col3 character(12) NULL,
	col4 character varying(120) NOT NULL,
	datecreation character(8) NOT NULL,
	evenements character varying(79) NOT NULL,
	base character(1) NOT NULL,
	contenuxml bytea NOT NULL,
    CONSTRAINT "pk_matable_id" PRIMARY KEY (id),
    CONSTRAINT "uk_matable_col1_datecreation" UNIQUE (col1,datecreation)
)
WITH (
  OIDS=FALSE
);
 
CREATE INDEX "idx_matable_col1" ON "monschema"."matable" USING btree ("col1");
CREATE INDEX "idx_matable_col2" ON "monschema"."matable" USING btree ("col2");
CREATE INDEX "idx_matable_col3" ON "monschema"."matable" USING btree ("col3");
CREATE INDEX "idx_matable_col4" ON "monschema"."matable" USING btree ("col4");
La requête de recherche est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
SELECT * FROM matable WHERE colX like 'mavaleur%' AND base IN (baselist) ORDER BY datecreation ASC;
où :
- colX = col1 ou col2 ou col3 ou col4.
- mavaleur = un string d'au moins 4 caractères.
- baselist = liste des bases possible 3 cas possible :
+ 'E'
+ 'A'
+ 'E','A'

La table contenant plus de 1,5Millions de ligne.



Mon problème est que lorsque je réalise une requête pour la première fois sur une colonne (ex :col1) où la valeur est de 4 caractères et le nombre d’occurrences de cette valeur dans la table est important (plus 50 000). Ma requête dure plus de 3 min.
Par contre une fois cette requête réalisée le temps de réponse sur la même requête est de moins d'une seconde (merci l'indexation je suppose).

Je souhaiterai donc savoir si ce comportement est normal ?

D'après ce que je crois avoir compris, lors de la première exécution de la requête postgres vérifie si le plan d'exécution existe déjà, évalue s'il est plus rapide de passer par les index.
Comme dans mon cas il n'y a pas eu d'indexation sur cette requête postgres doit se taper toute la table et faire l'indexation (ce qui prendrait du temps je suppose).

Du coup y a-t-il des moyens de gagner du temps sur cette première indexation ?

Peut être ai-je mal compris si oui quelqu'un pourrait-il m'expliquer le mécanisme d'indexation succinctement et m'aider à trouver une solution ?

Merci d'avance,

DD