AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Index bei Like

Ein Thema von Dumpfbacke · begonnen am 8. Dez 2013 · letzter Beitrag vom 11. Dez 2013
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Index bei Like

  Alt 9. Dez 2013, 08:11
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.
Dann ist hier FB aber sehr mangelhaft implementiert.
In Zeichen von SQL-Injection und Co. sollte alle Abfragen Parametrisiert erfolgen.

Das Problem tritt aber auch bei anderen DBMS auf, sogar beim Microsoft SQLServer 2008 R2, dann ist dieser auch schlecht designed.
http://stackoverflow.com/questions/1...erformance-hit
Kenn dieses Problem beim MS SQL-Server wenn man varchar und nvarchar mischt. Dann wird oft auf Full-Table-Scan umgeschaltet.
Wenn man konsequent nur nvarchar verwendet ist mir das bisher nicht aufgefallen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Index bei Like

  Alt 9. Dez 2013, 08:13
Zitat:
Dann ist hier FB aber sehr mangelhaft implementiert.
In Zeichen von SQL-Injection und Co. sollte alle Abfragen Parametrisiert erfolgen.
Ist halt nicht von Microsoft!
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Index bei Like

  Alt 9. Dez 2013, 08:46
Reinfallen kann man, wenn man hier Parameter verwendet in der Form:
Code:
where Strasse like :strasse
Das ist aber eine ausgesprochene Schwäche von FB und ein 'fail by design'. Die könnten das Teil auch mit Index kompilieren: Zur Not scant der den Index eben, anstatt den Suchstring anhand der Sortierposition zu finden. Na ja.
Hab ich auch lange drüber nachgedacht. Aber das Prepare ist nun mal vor der Zuweisung der Parameter.
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
Frank Reim

Geändert von dataspider ( 9. Dez 2013 um 08:48 Uhr)
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
329 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#14

AW: Index bei Like

  Alt 9. Dez 2013, 18:59
Benutze stattdessen
Code:
Where Strasse starting with 'Hauptstr'
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.
Das geht leider nicht oder zumindest mein Firebird 2.5 macht es nicht.
Tanja
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#15

AW: Index bei Like

  Alt 9. Dez 2013, 19:07
...eine sortierte Liste der Hashs...
Bestimmt (imho) keine sortierte Liste von Hashes, denn das müsste auch ein B-Baum sein und wäre auch nicht schneller. Wenn, dann eine Art Hashmap. Da geht das Matchen in O(1), wogegen bei einem B-Baum vom Aufwand O(log n) ist
Vielleicht eine Hashmap und die einzelnen Buckets noch mal sortiert? Dadurch hat man eine bessere Worst-Case-Laufzeit als bei einer „normalen“ Hashmap.

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.

Geändert von Namenloser ( 9. Dez 2013 um 19:10 Uhr)
  Mit Zitat antworten Zitat
Alt 9. Dez 2013, 19:47     Erstellt von Smut
Dieser Beitrag wurde von TBx gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Furtbichler
(Gast)

n/a Beiträge
 
#16

AW: Index bei Like

  Alt 9. Dez 2013, 19:56
Furchti nörgelt halt gerne über Firebird... ich denke, er ärgert sich, dass er selbst nicht mit FB arbeitete
Sag mal, bist Du irgendwie weich in der Birne?
  Mit Zitat antworten Zitat
Alt 9. Dez 2013, 19:57     Erstellt von Smut
Dieser Beitrag wurde von TBx gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
vagtler

Registriert seit: 9. Jul 2010
Ort: Köln
667 Beiträge
 
Delphi 2010 Professional
 
#17

AW: Index bei Like

  Alt 9. Dez 2013, 20:00
[...] Das geht leider nicht oder zumindest mein Firebird 2.5 macht es nicht.
Dann muss es aber wirklich an Deinem Firebird liegen. Schau in die Doku und staune.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#18

AW: Index bei Like

  Alt 10. Dez 2013, 05:38
Hallo,

starting with
sucht genau, also Groß- und Kleinschreibung wird beachtet.

Heiko
Heiko
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#19

AW: Index bei Like

  Alt 10. Dez 2013, 06:56
Vielleicht eine Hashmap und die einzelnen Buckets noch mal sortiert? Dadurch hat man eine bessere Worst-Case-Laufzeit als bei einer „normalen“ Hashmap.
... Bucketsort wird beim -on-the-fly- 'indizieren' verwendet, um kleinere Datenmengen zu sortieren und dadurch ein besseres Ergebnis zu erzielen. Eine Hashmap hat erst einmal keine Buckets, weil nicht klar ist, wie die Hashmap umgesetzt wurde (open hashing vs. separate chaining). Falls sie als separate chainging umgesetzt wurde, sind die einzelnen 'Buckets' bereits sortiert.

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.
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#20

AW: Index bei Like

  Alt 10. Dez 2013, 15:28
Generell sieht die Verwendung eines Index auf einem Feld c1 bei LIKE wie folgt aus:
Code:
select * from t1 where c1 like :c1
=> Kein Index, da parametrisierte Abfrage und zum Zeitpunkt des Prepare der Inhalt des Parameters nicht bekannt ist.
Code:
select * from t1 where c1 like '%Hugo'
=> Kein Index, wenn ein Wildcard als Prefix verwendet wird
Code:
select * from t1 where c1 like 'Hugo'
=> Index
Code:
select * from t1 where c1 like 'Hugo%'
=> Index, bei einem Wildcard als Suffix (wird intern ein STARTING WITH)
Code:
select * from t1 where c1 like upper('Hugo')
=> Index
Code:
select * from t1 where upper(c1) like 'Hugo'
=> Kein Index, da temporäres UPPER auf dem Feld. Abhilfe schafft hier ein Expression-Index, der den UPPER-Inhalt indexiert

Es gibt sicher noch andere Kombinationen ...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz