![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX
Index bei Like
Hallo Leute,
sagt einmal warum benutze Firebird bei einer Abfrage wie z.B.
Delphi-Quellcode:
Where Strasse like 'Hauptstr%'
keinen Index auch wenn einer vorhanden ist ? Tanja |
AW: Index bei Like
Benutze stattdessen
Code:
Der Plan bei Einsatz von Like benutzt keinen Index, da der Like-Parameter auch mit einer Wildcard anfangen könnte - und da nützt ein Index nichts.
Where Strasse starting with 'Hauptstr'
|
AW: Index bei Like
Zitat:
Jeder halbwegs vernünftiger Parser wird erkennen ob eine Wildcard am Anfang steht oder nicht. |
AW: Index bei Like
Es kommt auch auf die Art des Indizes drauf an.
Einen B-Tree kann man auch teilweise auflösen, also bis zum ersten Wildcard und braucht dann nicht mehr so viel zu durchsuchen. Ein Hash kann dagegen aber nur komplett aufgelöst benutzt werden. |
AW: Index bei Like
Zitat:
|
AW: Index bei Like
Einige DBMS können mehrere Indextypen.
MySQL kann zum BTREE und HASH, je nach verwendeter Speicherengine. Für reine DupplicateChecks ist eine sortierte Liste der Hashs wohl schneller durchsuchbar, als in einem B-Tree in mehrere Ebenen den passenden Ast zu finden. |
AW: Index bei Like
Zitat:
Gut, aber egal: Hash und Sortierung -> geht nicht -> LIKE geht auch nicht. |
AW: Index bei Like
Hi,
Firebird sollte hier einen Index verwenden, wenn dieser für das Feld STRASSE definiert ist. Reinfallen kann man, wenn man hier Parameter verwendet in der Form: where Strasse like :strasse und dann den Parameter strasse auf 'Hauptst%' setzt. Hier kann beim Prepare der Plan nicht ermittelt werden, da nicht klar ist, ob z.B. anstatt 'Hauptsr%' '%Hauptst%' als Wert für den Parameter kommt. Frank [EDIT] Was ich auch schon hatte: Die Selektivität des Index war irgendwie nicht funktionstüchtig... Kann man mit SET STATISTICS INDEX INDEX_NAME neu berechnen lassen. [/EDIT] |
AW: Index bei Like
Zitat:
|
AW: Index bei Like
Das Problem tritt aber auch bei anderen DBMS auf, sogar beim Microsoft SQLServer 2008 R2, dann ist dieser auch schlecht designed.
![]() |
AW: Index bei Like
Zitat:
In Zeichen von SQL-Injection und Co. sollte alle Abfragen Parametrisiert erfolgen. Zitat:
Wenn man konsequent nur nvarchar verwendet ist mir das bisher nicht aufgefallen. |
AW: Index bei Like
Zitat:
|
AW: Index bei Like
Zitat:
Es ist ja wohl so gedacht, dass bei Benutzung der Parameter nur 1 Mal das Prepare erfolgen soll und nicht bei jeder Neuzuweisung eines Parameterwertes. Die gewünschte Zeitersparnis geht hier natürlich in die Hose. Mir würde es anders auch gefallen, aber ob das bei anderen DB' s besser gelöst ist, weiß ich nicht. Ich bin übrigens schon in diese Falle getappt und Thomas Steinmaurer hat das näher erklärt... Frank |
AW: Index bei Like
Zitat:
|
AW: Index bei Like
Zitat:
Sowas war vor 1–2 Jahren mal im Gespräch als bei PHP ein Angriff bekannt wurde, bei dem URL-Parameter so präpariert werden konnten, dass es beim Ablegen der Parameter in einem assoziativen Array (was offenbar bei PHP als Hashmap realisiert ist) möglichst viele Kollisionen gab, mit dem Ergebnis dass man den Server sehr leicht lahmlegen konnte. Ich glaube, die PHP-Entwickler haben es am Ende einfach umgangen, indem sie die maximale Anzahl an Parametern standardmäßig limitiert haben. |
AW: Index bei Like
Zitat:
|
AW: Index bei Like
Zitat:
|
AW: Index bei Like
Hallo,
starting with sucht genau, also Groß- und Kleinschreibung wird beachtet. Heiko |
AW: Index bei Like
Zitat:
PS: Bei PHP wurde offenbar eine Hashmap mit fester Größe verwendet. Die Problematik kann durch eine dynamische Hashmap vermieden werden. Diese würde ihre Größe ggf. (zu viele Kollisionen) einfach verdoppeln. Da dadurch die Hashfunktion verändert wird, sollten die Angriffe ins Leere laufen. Aber wir kommen vom Thema ab. |
AW: Index bei Like
Generell sieht die Verwendung eines Index auf einem Feld c1 bei LIKE wie folgt aus:
Code:
=> Kein Index, da parametrisierte Abfrage und zum Zeitpunkt des Prepare der Inhalt des Parameters nicht bekannt ist.
select * from t1 where c1 like :c1
Code:
=> Kein Index, wenn ein Wildcard als Prefix verwendet wird
select * from t1 where c1 like '%Hugo'
Code:
=> Index
select * from t1 where c1 like 'Hugo'
Code:
=> Index, bei einem Wildcard als Suffix (wird intern ein STARTING WITH)
select * from t1 where c1 like 'Hugo%'
Code:
=> Index
select * from t1 where c1 like upper('Hugo')
Code:
=> Kein Index, da temporäres UPPER auf dem Feld. Abhilfe schafft hier ein Expression-Index, der den UPPER-Inhalt indexiert
select * from t1 where upper(c1) like 'Hugo'
Es gibt sicher noch andere Kombinationen ... :-D |
AW: Index bei Like
Zitat:
Und von Bucketsort war überhaupt nicht die Rede...? Zitat:
|
AW: Index bei Like
Zitat:
Zitat:
Hashmap hat X Einträge (X=Prim). Hashfunktion = F(Key) Mod X. Bei Vergrößerung auf Y Einträge (Y=Prim und ca. X*2) ist die Funktion F(Key) Mod Y. Da dürften nicht die gleichen Kollisionen auftreten... Aber da bin ich kein Spezi. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz