LIKE gewinnt (ohne Index) in verschiedenen Variationen mit ca. 500ms gegen 600ms. Zudem in LEFT() einen Parameter korrigieren...
das ist der erste teil der aussage, dass du mit LIKE keinen nachteil gegenüber LEFT hast, wenn kein index vorhanden ist.
LOL - anders sieht es gegen RIGHT() aus:
-- RIGHT(LTRIM(RTRIM())) gewinnt gegen
declare
@StartDate datetime
declare
@EndDate datetime
set
@StartDate = getdate()
select
count(*)
from
DT_1
where
(right(ltrim(rtrim(DF_1)), 4) = '1134')
set
@EndDate = getdate()
print
datediff(millisecond, @StartDate, @EndDate)
--
-- LIKE in diesem Beispiel (wir haben ein CHAR(50))
declare
@StartDate datetime
declare
@EndDate datetime
set
@StartDate = getdate()
select
count(*)
from
DT_1
where
(DF_1 like '%1134')
set
@EndDate = getdate()
print
datediff(millisecond, @StartDate, @EndDate)
--
-- mit ca. 750ms gegen ca. 13300ms
Soweit zu "keine Nachteile".
hast du den schon einen index über die spalte angelegt und dann nochmals beide abfragen ausgeführt und die zeiten verglichen ?
Moment, mach ich jetzt, hab ein wenig Zeit, OK, Index da, keine signifikanten Änderungen bei o.g. Abfrage. - Bei der zuerst untersuchten Abfrage mit LEFT(), Moment: Da braucht LEFT() immer noch ca. 600ms, LIKE "unfassbare und superüberraschende" 0ms. ;)
OK, liegt halt ein Index drauf und der Mist ist vorsortiert, ein Wert zwischen 20ms und 100ms wäre aber schon anstandsgemässer gewesen.
Ja, gut, halten wir das Resultat fest:
- LIKE ist im Durchschnitt langsamer als die Verwendung von Funktionen, wenn kein Index vorliegt
- LIKE ist sehr viel schneller, wenn ein INDEX vorliegt, der "genau die Abfrage trifft", ansonsten durchschnittlich langsamer (siehe Anlage)
Wer Lust hat kann die Performancemessungen mit T-SQL unter MS SQL Server so zu sagen jederzeit reproduzieren.
Anlage:
declare
@StartDate datetime
declare
@EndDate datetime
set
@StartDate = getdate()
select
count(*)
from
DT_1
where
(DF_1 like '1345%')
set
@EndDate = getdate()
print
datediff(millisecond, @StartDate, @EndDate)
-- mit Index 0ms bei 1.000.000 Datensätzen und CHAR(50)-Feldern
declare
@StartDate datetime
declare
@EndDate datetime
set
@StartDate = getdate()
select
count(*)
from
DT_1
where
(DF_1 like '%1345%')
set
@EndDate = getdate()
print
datediff(millisecond, @StartDate, @EndDate)
-- mit Index 14400ms bei 1.000.000 Datensätzen und CHAR(50)-Feldern