Podczas prowadzenia praktycznych warsztatów SQL Server Performance Tuning otrzymałem ostatnio pytanie, które dotyczyło porównania wydajności funkcji Trim i LTRIM/RTRIM.
W odniesieniu do funkcji trim, wcześniej pisałem o tym w poniższym wpisie na blogu i proszę o zapoznanie się z nim przed kontynuowaniem demonstracji z tego bloga.
- SERWERSQL – Funkcja TRIM do usuwania końcowych i końcowych spacji z łańcucha znaków – SQL in Sixty Seconds #040 – Video
- SERWERSQL – 2008 – Rozszerzona funkcja TRIM() – Usuwanie końcowych spacji, wiodących spacji, białych spacji, tabulatorów, Carriage Returns, Line Feeds
- SQL SERVER – 2008 – Funkcja TRIM() – Funkcja zdefiniowana przez użytkownika
- SQL SERVER – Funkcja TRIM() – UDF TRIM()
- SQL SERVER – 2017 – Jak usunąć spacje wiodące i wleczone za pomocą funkcji TRIM?
- SQL SERVER – Obserwacja wydajności funkcji TRIM
No to zacznijmy od prostego przykładu, w którym porównamy wydajność LTRIM/RTRIM z funkcją TRIM, która jest nowo wprowadzona w SQL Server
-- Create a sample tableCREATE TABLE Test (ID INT, Col1 CHAR(100))GOSET NOCOUNT ONINSERT Test (ID, Col1)VALUES (1,' a ')GO 1000INSERT Test (ID, Col1)VALUES (1,' b ')GO-- Create a nonclustered indexCREATE NONCLUSTERED INDEX IX_Test_Col1 ON Test (Col1);GO-- SELECT TESTSELECT IDFROM TestWHERE LTRIM(RTRIM(Col1)) = 'b'GOSELECT IDFROM TestWHERE TRIM(Col1) = 'b'GOSELECT IDFROM TestWHERE Col1 = ' b 'GO-- cleanupDROP TABLE TestGO
Teraz podczas testu mamy trzy instrukcje select, gdzie w dwóch przypadkach używamy zarówno LTRIM/RTRIM jak i funkcji TRIM. Porównajmy wydajność tego samego z instrukcją select, w której nie użyliśmy żadnej funkcji w klauzuli WHERE.
Jasno widać, że jeśli użyjemy jakiejkolwiek funkcji na kolumnie użytej w klauzuli WHERE, będziemy musieli uzyskać niską wydajność.