Optimisation auto-complétion espèce usuelle » Historique » Version 2
Ludovic Lestrat, 26/04/2018 12:45
| 1 | 1 | Ludovic Lestrat | 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 |
|---|---|---|---|
| 2 | |||
| 3 | |||
| 4 | 2 | Ludovic Lestrat | h2. Réindexation GIST en base |
| 5 | 1 | Ludovic Lestrat | |
| 6 | Supprimer à la main tous les index de ta table inpn.taxref et les recréer avec les commandes ci-dessous : |
||
| 7 | |||
| 8 | <pre> |
||
| 9 | CREATE INDEX classe_ind ON inpn.taxref USING gist (classe COLLATE pg_catalog."default" gist_trgm_ops); |
||
| 10 | CREATE INDEX famille_ind ON inpn.taxref USING gist (famille COLLATE pg_catalog."default" gist_trgm_ops); |
||
| 11 | CREATE INDEX lb_nom_ind ON inpn.taxref USING gist (lb_nom COLLATE pg_catalog."default" gist_trgm_ops); |
||
| 12 | CREATE INDEX nom_complet_ind ON inpn.taxref USING gist (nom_complet COLLATE pg_catalog."default" gist_trgm_ops); |
||
| 13 | CREATE INDEX nom_vern_ind ON inpn.taxref USING gist (nom_vern COLLATE pg_catalog."default" gist_trgm_ops); |
||
| 14 | CREATE INDEX ordre_ind ON inpn.taxref USING gist (ordre COLLATE pg_catalog."default" gist_trgm_ops); |
||
| 15 | CREATE INDEX phylum_ind ON inpn.taxref USING gist (phylum COLLATE pg_catalog."default" gist_trgm_ops); |
||
| 16 | CREATE INDEX regne_ind ON inpn.taxref USING gist (regne COLLATE pg_catalog."default" gist_trgm_ops); |
||
| 17 | CREATE INDEX taxref_cd_nom_idx ON inpn.taxref USING btree (cd_nom COLLATE pg_catalog."default"); |
||
| 18 | CREATE INDEX taxref_cd_ref_idx ON inpn.taxref USING btree (cd_ref COLLATE pg_catalog."default"); |
||
| 19 | |||
| 20 | </pre> |
||
| 21 | |||
| 22 | 2 | Ludovic Lestrat | h2. Remplacement de la fonction UNACCENT en base |
| 23 | 1 | Ludovic Lestrat | |
| 24 | 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. |
||
| 25 | On va donc créer une alias de la function unaccent, qui sera immutable : |
||
| 26 | |||
| 27 | <pre> |
||
| 28 | CREATE OR REPLACE FUNCTION f_unaccent(text) |
||
| 29 | RETURNS text AS |
||
| 30 | $func$ |
||
| 31 | SELECT public.unaccent('public.unaccent', $1) -- schema-qualify function and dictionary |
||
| 32 | $func$ LANGUAGE sql IMMUTABLE; |
||
| 33 | </pre> |
||
| 34 | |||
| 35 | Puis nous indexons le résultat de cette fonction pour la colonne _nom_vern_ sur laquelle s'applique la recherche. |
||
| 36 | |||
| 37 | <pre> |
||
| 38 | CREATE INDEX nom_vern_unaccent_ind |
||
| 39 | ON inpn.taxref |
||
| 40 | USING gist |
||
| 41 | (f_unaccent(nom_vern) COLLATE pg_catalog."default" gist_trgm_ops); |
||
| 42 | </pre> |
||
| 43 | |||
| 44 | 2 | Ludovic Lestrat | h2. Remplacement de la fonction UNACCENT dans le script |
| 45 | 1 | Ludovic Lestrat | |
| 46 | 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. |
||
| 47 | |||
| 48 | <pre> |
||
| 49 | UNACCENT(split_part(nom_vern, ' ', 1)) ILIKE UNACCENT('%" . $critere . "%') |
||
| 50 | </pre> |
||
| 51 | |||
| 52 | devient |
||
| 53 | <pre> |
||
| 54 | f_unaccent(nom_vern) ILIKE UNACCENT('%" . $critere . "%') |
||
| 55 | </pre> |
||
| 56 | |||
| 57 | Remplacement à effectuer sur 3 lignes de code, cf https://github.com/mathieubossaert/obs_occ/commit/7b6bb6d472e81c864a64b5d68b6caff19089db23#diff-89b0f17c68eb036282241881ff50b777 |