King Lully: LIKE vs. Stringfunktionen

Beitrag lesen

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