LIKE Performance verbessern



  • Moin!

    Gibt es unter Firebird oder wahlweise auch Oracle eine Möglichkeit, die Performance von LIKE Statements zu verbessern? Indizes greifen anscheinend gar nicht. Ich muss aus über 1 Mio Records Teilstrings in char(50) Feldern vergleichen 😞



  • Da wirst du mit Indizes nicht weit kommen, da diese nur bei exakter Gleichheit (des gesamten Texteintrags) greifen.
    Evtl. könntest du mal nachschauen, ob man bei der Datenbank "Volltextsuche" aktivieren kann (beim MSSQL-Server weiß ich, daß es das gibt).



  • Hmm, unter Firebird scheint er zumindest dann einen Index zu verweden wenn der Anfang der Suchzeichenfolge fix ist:

    select * from daten where feld like 'XYZ%'
    

    Ich glaub ich kann meine Daten so umformatieren, das ich das ausnutzen kann.

    (edit) Funktioniert so und ist damit erstmal erledigt.



  • Cpp_Junky schrieb:

    Hmm, unter Firebird scheint er zumindest dann einen Index zu verweden wenn der Anfang der Suchzeichenfolge fix ist

    Jo, das kannst Du Dir wirklich ziemlich haargenauso wie beim Index eines Telefonbuchs vorstellen: Mit "Mül*" findest Du "Müller" leichter als mit "*ler".

    Du kannst natürlich auch rückwärts indizieren oä, gibt da ein paar praktische Tricks. (Index auf reverse(foobar) etc.)

    Für's nächste Mal: EXPLAIN ist verdammt praktisch für solche Sachen, bzw. bei Firebird konnte man sich zumindest irgendwie mit "SET PLAN ONLY" den Query-Plan ansehen. Nicht ganz so schön, wie bei anderen RDBMS, aber besser als nichts.



  • Th69 schrieb:

    Da wirst du mit Indizes nicht weit kommen, da diese nur bei exakter Gleichheit (des gesamten Texteintrags) greifen.

    Nein, können durchaus auch bei teilweisen Matches toll greifen. Aber eben nicht, wenn Du nach "LIKE '%asdf%'" oä. suchst. 😉



  • Beim Begriff "Teilstrings" habe ich dies aber angenommen, also daß er LIKE '%asdf%' benutzt -)



  • Ein Index auf das eine Feld bringt schon was, nämlich dass er nimmer den Text aus der Tabelle holen muss, sondern stattdessen aus dem Index holen kann. Natürlich macht er immer noch nen Scan über alle Zeilen, aber bei recht breiten Tabellen macht es schon nen grossen Unterschied ob die ganze Tabelle oder nur ein vergleichsweise kleiner Index gescannt werden müssen.


Log in to reply