Optimisation auto-complétion espèce usuelle » Historique » Version 1
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 | h1. Réindexation GIST en base |
||
5 | |||
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 | h1. Remplacement de la fonction UNACCENT en base |
||
23 | |||
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 | h1. Remplacement de la fonction UNACCENT dans le script |
||
45 | |||
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 |