Projet

Général

Profil

Actions

L'auto-complétion lors de la saisie d'une espèce usuelle peut prendre jusqu'à une dizaine de seconde. Pour y pallier, voici comment procéder

Réindexation GIST en base

Supprimer à la main tous les index de ta table inpn.taxref et les recréer avec les commandes ci-dessous :

CREATE INDEX classe_ind ON inpn.taxref USING gist (classe COLLATE pg_catalog."default" gist_trgm_ops);
CREATE INDEX famille_ind ON inpn.taxref USING gist (famille COLLATE pg_catalog."default" gist_trgm_ops);
CREATE INDEX lb_nom_ind ON inpn.taxref USING gist (lb_nom COLLATE pg_catalog."default" gist_trgm_ops);
CREATE INDEX nom_complet_ind ON inpn.taxref USING gist (nom_complet COLLATE pg_catalog."default" gist_trgm_ops);
CREATE INDEX nom_vern_ind ON inpn.taxref USING gist (nom_vern COLLATE pg_catalog."default" gist_trgm_ops);
CREATE INDEX ordre_ind ON inpn.taxref USING gist (ordre COLLATE pg_catalog."default" gist_trgm_ops);
CREATE INDEX phylum_ind ON inpn.taxref USING gist (phylum COLLATE pg_catalog."default" gist_trgm_ops);
CREATE INDEX regne_ind ON inpn.taxref USING gist (regne COLLATE pg_catalog."default" gist_trgm_ops);
CREATE INDEX taxref_cd_nom_idx ON inpn.taxref USING btree (cd_nom COLLATE pg_catalog."default");
CREATE INDEX taxref_cd_ref_idx ON inpn.taxref USING btree (cd_ref COLLATE pg_catalog."default");

Remplacement de la fonction UNACCENT en base

La fonction unnacent ne permet pas d'utiliser l'index car on ne peut indexer le résultat d'une fonction qui n'est pas immutable.
On va donc créer une alias de la function unaccent, qui sera immutable :

CREATE OR REPLACE FUNCTION f_unaccent(text)
RETURNS text AS
$func$
SELECT public.unaccent('public.unaccent', $1)  -- schema-qualify function and dictionary
$func$  LANGUAGE sql IMMUTABLE;

Puis nous indexons le résultat de cette fonction pour la colonne nom_vern sur laquelle s'applique la recherche.

CREATE INDEX nom_vern_unaccent_ind
ON inpn.taxref
USING gist
(f_unaccent(nom_vern) COLLATE pg_catalog."default" gist_trgm_ops);

Remplacement de la fonction UNACCENT dans le script

Dans le fichier jEspecesUsuelles.php ( dossier ./Sources/Modeles/Json/), nous remplaçons la fonction unnacent par la nouvelle fonction f_unaccent et supprimons l'utilisation de la fonction splitpart devenue inutile.

UNACCENT(split_part(nom_vern, ' ', 1)) ILIKE UNACCENT('%" . $critere . "%')

devient

f_unaccent(nom_vern) ILIKE UNACCENT('%" . $critere . "%')

Remplacement à effectuer sur 3 lignes de code, cf https://github.com/mathieubossaert/obs_occ/commit/7b6bb6d472e81c864a64b5d68b6caff19089db23#diff-89b0f17c68eb036282241881ff50b777

Mis à jour par Ludovic Lestrat il y a environ 7 ans · 1 révisions