Diese Frage dreht sich um das, was ich mich frage, aber die Antworten sprechen sie nicht genau an.
Es scheint, dass '=' im Allgemeinen schneller als 'Gefällt mir' ist, wenn Platzhalter verwendet werden. Dies scheint die konventionelle Weisheit zu sein. Nehmen wir jedoch an, ich habe eine Spalte mit einer begrenzten Anzahl verschiedener fester, fest codierter Varchar-Bezeichner und möchte alle Zeilen auswählen, die mit einer von ihnen übereinstimmen:
select * from table where value like 'abc%'
und
select * from table where value = 'abcdefghijklmn'
'Like' sollte nur die ersten drei Zeichen testen müssen, um eine Übereinstimmung zu finden, während '=' die gesamte Zeichenfolge vergleichen muss. In diesem Fall scheint mir "Gefällt mir" einen Vorteil zu haben, wenn alle anderen Dinge gleich sind.
Dies ist als allgemeine akademische Frage gedacht und sollte daher keine Rolle spielen, welche Datenbank, aber sie ist mit SQL Server 2005 entstanden.
quelle
value
indiziert ist oder nicht . Wenn dies der Fall ist,=
ist eine einfache Suche ohne Tischscan erforderlich, die jedeLIKE
Aussage, die Sie darauf werfen, zunichte macht.LIKE
mit einem Platzhalter am Ende ist SARGable und führt daher eine Bereichssuche für einen Index durch, ohne dass ein Tabellenscan in Sicht ist. Diese Bereichssuche kann sehr gut mit einer=
Anweisung konkurrieren , und in vielen Fällen (z. B. wenn sich alle zufriedenstellenden Zeilen auf einer Seite befinden, eine nicht unwahrscheinliche Bedingung) kann genau dieselbe Leistung erzielt werden, die dieselbe Anzahl von Lesevorgängen zur Folge hat.Antworten:
Siehe https://web.archive.org/web/20150209022016/http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx
Zitat von dort:
quelle
Es ist ein messbarer Unterschied.
Führen Sie Folgendes aus:
Create Table #TempTester (id int, col1 varchar(20), value varchar(20)) go INSERT INTO #TempTester (id, col1, value) VALUES (1, 'this is #1', 'abcdefghij') GO INSERT INTO #TempTester (id, col1, value) VALUES (2, 'this is #2', 'foob'), (3, 'this is #3', 'abdefghic'), (4, 'this is #4', 'other'), (5, 'this is #5', 'zyx'), (6, 'this is #6', 'zyx'), (7, 'this is #7', 'zyx'), (8, 'this is #8', 'klm'), (9, 'this is #9', 'klm'), (10, 'this is #10', 'zyx') GO 10000 CREATE CLUSTERED INDEX ixId ON #TempTester(id)CREATE CLUSTERED INDEX ixId ON #TempTester(id) CREATE NONCLUSTERED INDEX ixTesting ON #TempTester(value)
Dann:
SET SHOWPLAN_XML ON
Dann:
SELECT * FROM #TempTester WHERE value LIKE 'abc%' SELECT * FROM #TempTester WHERE value = 'abcdefghij'
Der resultierende Ausführungsplan zeigt Ihnen, dass die Kosten der ersten Operation, des
LIKE
Vergleichs, etwa zehnmal teurer sind als der=
Vergleich.Wenn Sie einen
=
Vergleich verwenden können, tun Sie dies bitte.quelle
19.95
SQL Server-Kosten in zusätzlichen 19 Schlüsselsuchen, die tatsächlich nie eintreten (selbst im tatsächlichen Ausführungsplan basieren die angezeigten Kosten auf den geschätzten Teilbaumkosten)LIKE
, 203 ms für=
. Ich gehe davon aus, dass es keinen wirklichen Unterschied zwischen #temp und real table geben würde, wenn ich mehr Tests durchführen und genaue Durchschnittswerte ermitteln würde.Sie sollten auch bedenken, dass bei der Verwendung
like
einige SQL-Varianten Indizes ignorieren und die Leistung dadurch beeinträchtigt wird. Dies gilt insbesondere dann, wenn Sie das Muster "Beginnt mit" nicht wie in Ihrem Beispiel verwenden.Sie sollten sich wirklich den Ausführungsplan für die Abfrage ansehen und sehen, was er tut. Raten Sie so wenig wie möglich.
Davon abgesehen kann und wird das Muster "beginnt mit" in SQL Server optimiert. Es wird der Tabellenindex verwendet. EF 4.0 geschaltet
like
fürStartsWith
aus diesem Grund.quelle
Wenn nicht
value
indiziert ist, führen beide zu einem Tabellenscan. Der Leistungsunterschied in diesem Szenario ist vernachlässigbar.Wenn
value
indiziert wird, wie Daniel in seinem Kommentar hervorhebt,=
führt dies zu einer Indexsuche, die die Leistung von O (log N) darstellt. Das LIKE führt (höchstwahrscheinlich - abhängig davon, wie selektiv es ist) zu einem teilweisen Scan des Index>= 'abc'
und< 'abd'
erfordert mehr Aufwand als das=
.Beachten Sie, dass ich hier von SQL Server spreche - nicht alle DBMS sind mit LIKE zufrieden.
quelle
=
Fall als auch derlike '...%'
Fall verhalten sich gleich, wenn SQL das Muster erkennt (und dies auch tut), da in beiden Fällen die Unterbäume basierend auf Vergleichsrelationen ausgewählt werden.'abd'
ist erreicht.Sie stellen die falsche Frage. In Datenbanken kommt es nicht auf die Leistung des Bedieners an, sondern immer auf die SARG-Fähigkeit des Ausdrucks und die Deckbarkeit der Gesamtabfrage. Die Leistung des Bedieners selbst ist weitgehend irrelevant.
Also, wie
LIKE
und zu=
vergleichen , in Bezug auf SARGability?LIKE
Wenn es mit einem Ausdruck verwendet wird, der nicht mit einer Konstanten beginnt (z. B. wenn es verwendet wirdLIKE '%something'
), ist es per Definition nicht SARGabale. Aber macht das=
oderLIKE 'something%'
SARGable? Nein. Wie bei jeder Frage zur SQL-Leistung liegt die Antwort nicht in der Abfrage des Texts, sondern im bereitgestellten Schema. Dieser Ausdruck kann SARG-fähig sein, wenn ein Index vorhanden ist, der sie erfüllt.Um ehrlich zu sein, gibt es kleine Unterschiede zwischen
=
undLIKE
. Die Frage, ob ein Operator oder ein anderer Operator in SQL "schneller" ist, entspricht der Frage "Was geht schneller, ein rotes oder ein blaues Auto?". Sie sollten Fragen zur Motorgröße und zum Fahrzeuggewicht stellen, nicht zur Farbe ... Um Fragen zur Optimierung relationaler Tabellen zu beantworten, sollten Sie Ihre Indizes und Ausdrücke in der WHERE-Klausel (und anderen Klauseln, aber normalerweise) suchen beginnt mit dem WO).quelle
Ein persönliches Beispiel mit MySQL 5.5: Ich hatte eine innere Verknüpfung zwischen zwei Tabellen, einer von 3 Millionen Zeilen und einer von 10.000 Zeilen.
Bei Verwendung eines Like für einen Index wie unten (keine Platzhalter) dauerte es ungefähr 30 Sekunden:
mit 'erklären' bekomme ich:
Bei Verwendung eines '=' für dieselbe Abfrage dauerte es ungefähr 0,1 Sekunden:
Mit 'EXPLAIN' bekomme ich:
Wie Sie sehen können, wurde die
like
Indexsuche vollständig abgebrochen, sodass die Abfrage 300-mal länger dauerte.quelle
Vielleicht suchen Sie nach Volltextsuche .
quelle
Das wichtigste zuerst ,
Sie sind nicht immer gleich
select 'Hello' from dual where 'Hello ' like 'Hello'; select 'Hello' from dual where 'Hello ' = 'Hello';
Wenn die Dinge nicht immer gleich sind, ist es nicht so relevant, über ihre Leistung zu sprechen.
Wenn Sie an Zeichenfolgen und nur an Zeichenvariablen arbeiten, können Sie über die Leistung sprechen. Verwenden Sie like und "=" jedoch nicht als allgemein austauschbar.
Wie Sie in vielen Posts (oben und in anderen Fragen) gesehen haben, ist in Fällen, in denen sie gleich sind, die Leistung von "Gefällt mir" aufgrund des Mustervergleichs (Kollatierung) langsamer.
quelle
'Hello '
es einVARCHAR
(Standard) ist, sind Sie korrekt, aber wenn es ein istCHAR
, sind Sie es nicht. Wirf es auf aCHAR(7)
und beide geben true zurück.TRIM
Und was zum Teufel machst du, wo du deine Varchars nicht machst? (Hinweis: Dies ist zumindest der Fall inSQL Server 2008r2
)