L'amélioration de la '% % ' de la Requête sur la Base de données Firebird
Situation:
Je suis en train d'écrire un efficace requête à l'aide de "j'AIME" déclaration pour s'occuper d'un morceau de texte dans une colonne avec des textes courts.
Modèle:
Table 'EVENTSGENERAL' : { ID (KEY), GENERATOR_ (FK), DATETIME, COMPUTERNAME, OSLOGIN, DBLOGIN, INFOTYPE, INFO }
Table 'EVENTSGENERATORS' : { ID (KEY), GENERATOR_ (FK), SHORTNAME, LONGNAME }
Table 'EVENTSINFOTYPES' : { ID (KEY), GENERATOR_ (FK), VERSION_, INFOTYPE, DESCRIPTION }
Index : EVENTSGENERAL.GENERATOR
, EVENTSGENERAL.DATETIME
, EVENTSINFOTYPES.INFOTYPE
Tous Croissant.
Ma Requête:
SELECT FIRST @first SKIP @skip A.ID,B.LONGNAME, A.DATETIME, A.COMPUTERNAME,A.OSLOGIN, A.DBLOGIN, C.DESCRIPTION, A.INFO
FROM EVENTSGENERAL A JOIN EVENTSGENERATORS B ON B.GENERATOR_ = A.GENERATOR_
JOIN EVENTSINFOTYPES C ON C.GENERATOR_ = A.GENERATOR_ AND C.INFOTYPE = A.INFOTYPE
WHERE C.DESCRIPTION LIKE '%VALUE%'
Problème:
Cette requête s'exécute sur des grandes bases de données. Est-il possible que je peux l'améliorer ?
Je suis l'aide d'une base de données Firebird.
Merci d'avance.
OriginalL'auteur Marcello Grechi Lins | 2012-01-25
Vous devez vous connecter pour publier un commentaire.
Non, malheureusement pas, parce que vous utilisez des caractères génériques (
%
) sur les deux côtés de laLIKE
mot-clé. Le premier (début) générique signifie qu'aucun indice peut être utilisé pour aider à améliorer la vitesse de recherche, et par conséquent, chaque ligne doit être examinée pour voir si elle répond aux critères.Vous pouvez accélérer les choses un peu en changeant de
LIKE 'VALUE%'
au lieu de cela, un index peut au moins être utilisé pour limiter les lignes de recherche en cours à partir duVALUE
.Si tu veux dire " la VALEUR%, vous devriez être en mesure de l'indice de VALEUR pour certains gains de performance. Vous pouvez essayer de créer l'index et ensuite de faire Filebird l'équivalent d'un "plan d'expliquer".
Modifié pour inclure
LIKE 'VALUE%'
effet sur la vitesse des requêtes.En effet, il a utilisé l'indice que j'ai créé lorsque j'ai utilisé la requête sans le premier
WildCard
. Merci pour l'aide @KenWhiteOriginalL'auteur Ken White
De la recherche plein texte (à l'aide de
%VALUE%
) est lent, car il n'existe pas de moyen efficace de le faire. C'est comme attraper un dictionnaire pour faire une liste de tous les mots que contenir la lettre Q. Qui prend une éternité. Sur l'autre main, si vous recherchez seulementVALUE%
il est beaucoup plus facile (si le champ de recherche est indexée). C'est comme faire une liste de tous les mots que commencer avec la lettre Q. C'est simple, si les mots sont triés par ordre alphabétique (comme ils le sont dans un dictionnaire). Vous pouvez facilement trouver les premier et dernier mots, et vous pouvez être sûr que vous avez besoin de tout entre les deux et rien d'autre.Certaines bases de données permettent une recherche en plein texte, ils peuvent index de chaque mot dans une colonne, mais seulement le mot complet. Donc, la recherche de
%q%
serait encore lent, et la recherche deq%
serait plus rapide. Je ne suis pas sûr de savoir si ou de ne pas Firebird prend en charge.Si vous avez une grande base de données et que vous voulez être en mesure de rechercher pour
%q%
, vous devriez envisager d'autres solutions spécialisées, comme Lucene ou XapianWord%
requête pour accélérer les choses. Ce n'est pas ce que je voulais,mais au moins permet pour l'instant. Après la première version, j'ai peut vérifier lucene pour voir si elle correspond à mes besoins. Merci encore !Je vois quel est le problème "El Corte Inglés" si je writte "el" est-il un moyen de incremente serch pour les mots de la Capitale ou Pas
OriginalL'auteur Arjan