Antworten:
Versuchen Sie Folgendes, um den Leistungsunterschied festzustellen:
SELECT count(*)
FROM master..sysobjects as A
JOIN tempdb..sysobjects as B
on A.name = B.name
SELECT count(*)
FROM master..sysobjects as A
JOIN tempdb..sysobjects as B
on A.name LIKE B.name
Der Vergleich von Zeichenfolgen mit '=' ist viel schneller.
LIKE
und der Gleichheitsoperator hat unterschiedliche Zwecke, sie tun nicht dasselbe:
=
ist viel schneller, wohingegen LIKE
Platzhalter interpretiert werden können. Verwenden =
Sie, LIKE
wo immer Sie können und wo immer Sie müssen.
SELECT * FROM user WHERE login LIKE 'Test%';
Beispielübereinstimmungen:
TestUser1
TestUser2
TestU
Test
Nach meiner kleinen Erfahrung:
"=" für genaue Übereinstimmungen.
"LIKE" für Teilübereinstimmungen.
Es gibt noch ein paar andere Tricks, die Postgres für den String-Abgleich anbietet (falls dies zufällig Ihre Datenbank ist):
ILIKE, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird:
select * from people where name ilike 'JOHN'
Streichhölzer:
Und wenn Sie wirklich wütend werden möchten, können Sie reguläre Ausdrücke verwenden:
select * from people where name ~ 'John.*'
Streichhölzer:
Nur als Heads-Up füllt der Operator '=' Zeichenfolgen mit Leerzeichen in Transact-SQL. Also 'abc' = 'abc '
wird wahr zurückkehren; 'abc' LIKE 'abc '
wird false zurückgeben. In den meisten Fällen ist '=' korrekt, in einem meiner jüngsten Fälle jedoch nicht.
Während '=' schneller ist, könnte LIKE Ihre Absichten expliziter angeben.
LIKE
wird für den Mustervergleich verwendet und =
wird für den Gleichheitstest verwendet (wie durch den COLLATION
verwendeten definiert).
=
kann Indizes verwenden, während LIKE
Abfragen normalerweise das Testen jedes einzelnen Datensatzes in der Ergebnismenge erfordern, um ihn herauszufiltern (es sei denn, Sie verwenden die Volltextsuche), um =
eine bessere Leistung zu erzielen.
Es gibt noch einen weiteren Grund für die Verwendung von "Gefällt mir", auch wenn die Leistung langsamer ist: Zeichenwerte werden beim Vergleich implizit in Ganzzahlen konvertiert.
deklariere @transid varchar (15)
if @transid! = 0
Sie erhalten den Fehler "Die Konvertierung des Varchar-Werts '123456789012345' hat eine int-Spalte übergelaufen".