Module J5
Dalibo SCOP
24.09
29 août 2024
Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :
PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.
Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 12 à 16.
De nombreuses fonctionnalités d’indexation sont disponibles dans PostgreSQL :
SELECT col4 FROM ma_table WHERE col3<12 and f(col1)=7 and col2 LIKE 'toto%' ;
CREATE INDEX idx_adv ON ma_table (f(col1), col2 varchar_pattern_ops) INCLUDE (col4) WHERE col3<12 ;
Un autre type d’index
GIN : Generalized Inverted iNdex
Quels tableaux contiennent une valeur donnée ?
@>
<@
=
&&
?
?|
?&
SELECT * FROM matable WHERE a @> ARRAY[42] ;
CREATE INDEX ON tablo USING gin (a);
SELECT * FROM voitures WHERE regexp_split_to_array(caracteristiques,',') @> '{"toit ouvrant","climatisation"}' ;
CREATE INDEX idx_attributs_array ON voitures USING gin ( regexp_split_to_array(caracteristiques,',') ) ;
jsonb_path_ops
jsonb_ops
pg_trgm
gin_trgm_ops
btree_gin
maintenance_work_mem
fastupdate
GiST : Generalized Search Tree
Le GiST indexe à peu près n’importe quoi
D’autres usages recouvrent en partie ceux de GIN.
SELECT … ORDER BY ma_colonne <-> une_référence LIMIT 10 ;
SELECT p, p <-> point(18,36) FROM mes_points ORDER BY p <-> point(18, 36) LIMIT 4 ;
Contrainte d’exclusion : une extension du concept d’unicité
n-uplet1 = n-uplet2
n-uplet1 op n-uplet2 interdit dans une table
n-uplet1 op n-uplet2
op est n’importe quel opérateur indexable par GiST
op
Exemple :
CREATE TABLE circles ( c circle, EXCLUDE USING gist (c WITH &&));
Indexation des recherches LIKE '%critère%'
LIKE '%critère%'
Similarité basée sur des trigrammes
CREATE EXTENSION pg_trgm; SELECT similarity('bonjour','bnojour'); similarity ------------ 0.333333
CREATE INDEX test_trgm_idx ON test_trgm USING gist (text_data gist_trgm_ops);
btree_gist
BRIN : Block Range INdex
CREATE INDEX brin_demo_brin_idx ON brin_demo USING brin (age) WITH (pages_per_range=16) ;
CLUSTER
<
>
!=
https://dali.bo/j5_quiz
Tous les TP se basent sur la configuration par défaut de PostgreSQL, sauf précision contraire.