Die Verbesserung von "% LIKE % " - Abfrage auf Firebird-Datenbank
Situation:
Ich bin versucht zu schreiben, eine effiziente Abfrage mit "LIKE" - Anweisung, um sich nach einem Stück text in eine Spalte mit kurzen Texten.
Modell:
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 }
Indizes : EVENTSGENERAL.GENERATOR
, EVENTSGENERAL.DATETIME
, EVENTSINFOTYPES.INFOTYPE
Alle Aufsteigend.
Meine Abfrage:
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%'
Problem:
Diese Abfrage ausführen, die auf extra-großen Datenbanken. Gibt es eine Möglichkeit, kann ich es verbessern ?
Ich bin mit einer Firebird-Datenbank.
Vielen Dank im Voraus.
InformationsquelleAutor Marcello Grechi Lins | 2012-01-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, leider nicht, weil Sie Platzhalter verwenden (
%
) auf beiden Seiten derLIKE
Schlüsselwort. Die Vorderkante (Beginn) Platzhalter bedeutet, dass kein index verwendet werden kann, um zur Verbesserung der Suchgeschwindigkeit, und daher jede Zeile muss untersucht werden, um zu sehen, ob es die Kriterien erfüllt.Können Sie die Dinge beschleunigen etwas durch den Wechsel zu
LIKE 'VALUE%'
statt; ein index kann zumindest verwendet werden, um die Begrenzung der Zeilen, die durchsucht werden, um diese beginnend mitVALUE
.Wenn du meinst LIKE 'VALUE%', Sie sollten in der Lage sein, um index-WERT für einige performance-Gewinne. Sie können versuchen, erstellen Sie den index, und dann tut Filebird ist das äquivalent zu einem "explain plan".
Bearbeitet gehören
LIKE 'VALUE%'
Effekt auf die Geschwindigkeit von Abfragen.In der Tat, es verwendet den index habe ich erstellt, wenn ich die Abfrage ohne die erste
WildCard
. Danke für die Hilfe @KenWhiteInformationsquelleAutor Ken White
Volltextsuche (mit
%VALUE%
) ist langsam, weil es keine effiziente Weise, das zu tun. Es ist wie mit einem Wörterbuch, um eine Liste aller Wörter, die enthalten den Buchstaben f: Das dauert ewig. Auf der anderen Seite, wenn Sie nur auf der Suche nachVALUE%
es ist viel einfacher (wenn das such-Feld ist indiziert). Es ist wie eine Liste aller Wörter, die start mit den Buchstaben Q. Das ist ganz einfach, wenn Sie die Wörter werden alphabetisch sortiert (wie Sie in einem Wörterbuch). Sie können leicht zu finden, die ersten und letzten Worte, und Sie können sicher sein, dass Sie müssen alles, was in zwischen-und sonst nichts.Einige Datenbanken erlauben eine Volltext-Suche, Sie können den index jedes Wort in einer Spalte, aber nur das vollständige Wort. So Suche für
%q%
wäre noch langsam, und die Suche nachq%
wäre schneller. Ich bin mir nicht sicher, ob oder ob nicht Firebird unterstützt.Wenn Sie eine große Datenbank haben und Sie wollen in der Lage sein, um die Suche für
%q%
haben, sollten Sie sich in andere, spezialisierte Lösungen, wie Lucene oder XapianWord%
Abfrage um die Dinge zu beschleunigen. Es ist nicht das, was ich wollte,aber zumindest hilft für jetzt. Nachdem die erste Version, die ich überprüfen kann lucene, um zu sehen, ob es passt meine Bedürfnisse. Nochmals vielen Dank !Ich sehe, was das problem ist "El Corte Inglés", wenn ich writte "el" gibt es einen Weg, um incremente fast für die Worte, die Kapital-oder Nicht
InformationsquelleAutor Arjan