0 votes

Jointure interne sur les regex

J'ai une jointure interne sur des expressions régulières - c'est très lent. Existe-t-il un moyen simple d'accélérer le processus ? J'utilise Postgres.

FROM A
inner join B ON trim(lower(replace(replace(replace(B.enginequery,',',' '),'"',' '),'+',' '))) = trim(lower(A.keyphrase))
             OR trim(lower(replace(replace(replace(B.enginequery,',',' '),'"',' '),'+',' '))) ~ (trim(lower(A.keyphrase)) || '$')
             OR trim(lower(replace(replace(replace(B.enginequery,',',' '),'"',' '),'+',' '))) ~ (trim(lower(A.keyphrase)) || ' ')

3voto

OMG Ponies Points 144785

Y a-t-il un moyen simple d'accélérer le processus ?

Les performances en pâtissent en raison de toutes les opérations, sans parler de l'expression rationnelle, qui doivent être effectuées pour obtenir une correspondance. Vous devez simplifier la relation pour que ces opérations ne soient pas nécessaires.

1voto

MaasSql Points 917

Je commencerais par placer les résultats de :

 trim(lower(replace(replace(replace(B.enginequery,',',' '),'"',' '),'+',' ')))

dans une colonne de votre tableau. Au moins, on n'aurait pas à le calculer de façon répétée. Je ne sais pas comment mettre cela en œuvre dans Postgres. Dans Ms sql server, j'essaierais une colonne calculée pour que mes applications n'aient pas à connaître la mise à jour de B.enginequery et sa version nettoyée.

Et ensuite, je finirais probablement par tenter un index sur cette colonne nettoyée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X