Auswirkungen auf die Leistung in Oracle für die Verwendung von LIKE 'string' vs = 'string'?
Diese
SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE '%some_value%';
langsamer ist als dieser
SELECT * FROM SOME_TABLE WHERE SOME_FIELD = 'some_value';
aber was ist das?
SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE 'some_value';
Meine Tests haben gezeigt, dass die zweite und Dritte Beispiele sind genau die gleichen. Wenn das wahr ist, meine Frage ist, warum immer das "=" ?
Welchen test hast du gemacht?
1 - Ran eine Anweisung für eine große Tabelle mit beiden Methoden viele Zeiten, in Anbetracht der Ausführungszeit 2 - Schaute auf den plan erklären
1 - Ran eine Anweisung für eine große Tabelle mit beiden Methoden viele Zeiten, in Anbetracht der Ausführungszeit 2 - Schaute auf den plan erklären
InformationsquelleAutor JosephStyons | 2008-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt einen klaren Unterschied, wenn Sie verwenden Sie bind-Variablen, die Sie verwenden sollten in der von Oracle für etwas anderes als data-warehousing-oder anderen Massen-Daten-Operationen.
Nehmen wir den Fall:
Oracle kann nicht wissen, dass der Wert von :b1 '%some_value%', oder 'some_value' etc. bis der Ausführungszeit, so wird es machen Sie eine Schätzung der Kardinalität des Ergebnisses basierend auf Heuristiken und kommen mit einer geeigneten plan, die entweder sein kann oder nicht, eignet sich für verschiedene Werte von b, wie'%','%', 'A' etc.
Ähnliche Probleme anwenden können mit einem gleichheitsprädikat aber im Bereich von kardinalitäten führen könnten, ist viel leichter geschätzt, basierend auf der Spalte Statistik oder das Vorhandensein einer unique-Einschränkung, zum Beispiel.
So, ich persönlich würde nicht anfangen mit WIE als ein Ersatz für =. Der Optimierer ist sehr einfach zu täuschen manchmal.
InformationsquelleAutor David Aldridge
Check-out die ERKLÄREN SIE PLANEN für beide. Sie erzeugen den gleichen execution-plan, also der Datenbank, Sie sind die gleiche Sache.
Verwenden Sie = , test auf Gleichheit, nicht ähnlichkeit. Wenn Sie Steuern den Vergleichswert, dann es macht nicht viel Unterschied. Wenn es das ist, eingereicht werden und von einem Benutzer, dann "apple" und " apple - %' würde Ihnen sehr unterschiedliche Ergebnisse.
Ja, wenn Sie verwenden Sie bind-Variablen, wie Sie sollten, der Optimierer nicht wirklich wissen, was Sie gehen zu übergeben. Also, es kann nicht unbedingt optimieren, für die mit einer wild card auf einer Seite. (Natürlich Oracle möglicherweise gearbeitet haben, um dieses Merkmal).
InformationsquelleAutor Wayne
Eine bessere Frage: Wenn das wahr ist, warum der Gebrauch von "WIE" - test für die Gleichheit? Sie sparen schlagen die shift-Taste, und jeder, der Sie liest das Skript wird zu verwechseln.
InformationsquelleAutor James Curran
Haben Sie es ausprobiert? Testen ist der einzig sichere Weg zu wissen.
Nebenbei, keine dieser Aussagen sind sicher wieder den gleichen Zeilen. Ausprobieren:
Hinsichtlich der Klarheit und zur Vermeidung subtile bugs, es ist am besten verwenden Sie niemals WIE, es sei denn, Sie benötigen es wildcard-Funktionalität. (Natürlich, wenn Sie ad-hoc-Abfragen, ist es wahrscheinlich in Ordnung.)
LIKE '%some_value%'
gibt alle drei Datensätze= 'some_value'
gibt nur den zweiten DatensatzLIKE 'some_value'
gibt den ersten und Dritten Datensätze.InformationsquelleAutor Jon Ericson
LIKE '%WAS%', um eine volle index-scan.
Wenn es nicht Prozent, dann wirkt es wie ein gleich.
Wenn % ist an einem Ende, dann kann der index eine range-scan.
Ich bin mir nicht sicher, wie der Optimierer verarbeitet gebundenen Feldern.
InformationsquelleAutor Greg Ogle
like
ist formal das gleiche, wenn Sie nicht Zeichen wie$%
etc, so dass es nicht eine große überraschung zu finden, dass es die gleichen Kosten.Ich finde David Aldridge Antwort interessant, wie Ihre Anwendung sollte mit bind-Variablen. Mit einem
like '%foobar'
Sie können Gebrauch machen von einer Bestellung im index. Wenn die Abfrage vorkompiliert wird Es dazu führen, mehr index oder die Tabelle, vollständige Scans.Außerdem finde ich es gefährlich, wie es kann dazu führen, SQL-Injektionen und seltsame bugs ( zum Beispiel, wenn es einen Benutzer namens john ein hacker kann erstellen Sie einen Benutzer mit dem Namen
'joh$'
und versuchen, sich anzumelden).warum das Risiko eingehen?
'='
ist klarer und hat keine dieser Probleme.InformationsquelleAutor borjab
1) % und = sollen in verschiedenen Szenarien eingesetzt werden.
Auch wenn wir suchen, mit dem genauen Wert in der like-Klausel und das gewünschte Ergebnis zu erhalten, sollte man noch mit = in allen solchen Szenarien. Daher, Wann immer wir einen genauen Wert gesucht werden, die wir immer verwenden sollten =.
2) die Leistung von like und = wenn kein % ist im Suche-Klausel:
In allen solchen Fällen, Abfrageoptimierer automatisch konvertiert wie cluase zu =. Und dies kann sich aus der Abfrage-plan (siehe screenshots im Anhang) . Damit die Leistung sollte genau das gleiche in diesem Fall. Dank der Abfrageoptimierer!
Liefere ich die screenshots der Ausführungspläne beider Abfragen d.h. die Abfrage mit like-Klausel aber ohne % und Abfrage mit like-Klausel und mit %.
InformationsquelleAutor user3260035