Wie schnell ist Like im Vergleich zu "=" bei einer ADO DB Anbindung.
-
Hallo,
ich habe eine ADO Anbindung an Access und will nun Anfragen an die Datenbank machen. Da ich Wildcards benutzen will muß ich beim erstellen meines SQL strings aufpassen ob in meinem Abfragekriterium in der Whereklaussel nun Wildcards benutzt werden oder nicht um entscheiden zu können ob ich "=" benutze oder "LIKE".
Nun habe ich rausgefunden, daß ich aber rein theoretisch immer "LIKE" benutzen kann. Nun frage ich mich aber, ob die Abfrage dadruch viel langsamer wird oder ob das SQL intern das merkt und die Anfrage gleichschnell ist?
Weiß da jemand bescheid?Danke
grußund sorry falls ich nicht die richtige Rubrik habe, aber ich wußte nicht wo ich das reinbringen kann und da ich unter MFC programmiere also hier hinein

-
LIKE und = sind 2 unterschiedliche Dinge.
Du solltest nicht einfach für alles LIKE nehmen.
Was ist wenn es z.B.
ruge
rugenin der DB gibt
Du macht jetzt LIKE 'ruge%'
NUN bekommst du 2 Datensätze obwohl eigentlich nur ruge gesucht wurde.
-
Ja da hast du Recht, daß es unterschiedliche Dinge sind, aber man kann das LIKE als Ersatz für "=" nutzen.
wenn ich
WHERE City LIKE "Berlin" mache, ist das gleich wie
WHERE City="Berlin"
ich bekomme bei beiden Anfragen das gleiche Ergebnis.Aber ich übergebe das Suchwort, also in dem Fall BErlin. Und wenn ich die "like" version benutze, dann kann ich in meinem Suchwort auch Wildcards nutzen ohne eine extra Funktion nehmen zu müssen.
Ich vermute nur, daß die Version mit dem "like" langsamer ist.
-
Das kannst du ganz einfach testen.
-
Ja da hast du natürlich Recht. Habe es auch ausprobiert und bei meinen Daten erscheint es gleichschnell, aber ganz ehrlich wundert mich das und ich sollte halt wirklich wissen ob es so ist oder nicht.
Also wenn jemand weiß wo ich das erfahren kann dann wäre das nett.Thx
-
Hi! Hatte gerade ein Access-Projekt mit einem Table > 500.000 Records.
Zeitmessung bei ansonsten identischer Suche in indiziertem Textfeld:
Abfrage mit 'LIKE': 4.8 sec
Abfrage mit '=': 0.1 secBei Tabellen dieser Größe ist es also sehr ratsam, wann immer es geht '=' anstatt 'LIKE' zu benutzen. Bei kleineren Tabellen ist der Effekt möglicherweise nicht so groß, er dürfte aber auch hier messbar sein.
Der kleine Aufwand, die Sucheingabe nach Wildcards zu parsen und dann den passenden Operator einzusetzten, lohnt sich aus meiner Erfahrung allemal.
Gruß T.

-
Hallo Theo,
danke für deine Antwort. Mich wundert etwas der große Unterschied. Bei meinem Projekt muß ich mehrere Tabellen Joinen und die größte Einzeltabelle hat über 1 000 000 Einträge. Nun habe ich meine Joins so gelegt, daß ich erst eine vorauswahl mit Select-From-Where in den einzelnen Tabellen mache und dann erst die joins durchführe.
Meine Ergebnismenge besteht dann zum Beispiel aus 30 000 Records. Komischerweise ist bei mir "=" genauso schnell/langsam wie "LIKE". Access braucht bei der Verarbeitung der SQL-Query zwischen 4 und 5 Sekunden.
Komisch... vielleicht schau ich doch nochmal was ich noch anders machen kann.

Meine Datenbankanbindung besteht übrigens aus ADO/Jet ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=")
Dann habe ich noch folgende "Cursor-Defines" gemacht, allerdings mache es seltsamerweise keinen Unterschied was für einen Cursortyp ich habe obwohl das ja Geschwindigkeitstechnisch andes sein sollte oder?
m_pRecordset->CursorLocation = ADODB::adUseClient; m_pRecordset->CursorType = ADODB::adOpenForwardOnly;
-
Ich denke das es auf den Optimierer ankommt.
Wenn du jetzt = übergibst kann dieser bereits alle Ergebniss verwerfen welche eine <> Zeichenkette im Feld haben. Jetzt muss er nur noch den Rest durchsuchen.
Ist vermutlich Von DB zu DB verschieden.