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.
LIKEund der Gleichheitsoperator hat unterschiedliche Zwecke, sie tun nicht dasselbe:
=ist viel schneller, wohingegen LIKEPlatzhalter interpretiert werden können. Verwenden =Sie, LIKEwo 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.
LIKEwird für den Mustervergleich verwendet und =wird für den Gleichheitstest verwendet (wie durch den COLLATIONverwendeten definiert).
=kann Indizes verwenden, während LIKEAbfragen 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".