關於TRIM的優化技巧


背景

今天在論壇中,看到有人在問一個千萬級別表查詢的優化。一個簡單的查詢幾分鍾。語句如下

SELECT  work_date ,
        major ,
        style ,
        jo_key_seq ,
        component ,
        qty ,
        bundle_id ,
        jo_sku_key_seq
FROM    dbo.rfid_transaction_table
WHERE   RTRIM(style) = '68036N/SS10'
        AND work_date >= '2009-07-01'
        AND work_date <= '2017-10-01'
        AND major = '911'

我給他的建議是:1 調整索引 2.不要在style字段上使用函數。今天先不管索引的調整,對於第二點,他使用了RTRIM。今天分享下RTRIM知識點和相關的優化技巧。

 

案例

 

RTRIM,LTRIM 都是用來去掉空格的,大家可能都知道。但是有幾個知識點大家可能不知道。就是在用where條件去對比篩選時,SQL SERVER 會自動去掉右邊的字符串的空格。

以下例子在SQL SERVER 2008 測試

例如:

 

CREATE TABLE test2(id int,name VARCHAR(22))
INSERT INTO test2 VALUES(1,'owen ')
INSERT INTO test2 VALUES(2,'owen  ')
INSERT INTO test2 VALUES(3,'owen  ')
SELECT * FROM test2 WHERE name='owen'

如下圖所示,3條記錄都是可以查出來的。

 

 


和   SELECT * FROM test2 WHERE RTRIM(name)='owen' 查詢結果是一樣的

所以大家在開發的時候,where 條件加上rtrim是沒有必要的

對應LTRIM 呢
INSERT INTO test2 VALUES(4,' owen  ')--左邊加入空格
SELECT * FROM test2 WHERE name='owen' 
仍然只能查出3條記錄。所以SQL SERVER 沒法去掉左邊的空格。


對索引的影響

 

我們都知道對字段使用函數會使字段上的索引失效。那么RTRIM 和 LTRIM 會使用索引失效嗎?我們用
SELECT  [DocumentID] ,
        [Title]
FROM    [AdventureWorks].[Production].[Document]
WHERE   Title = 'Crank Arm and Tire Maintenance'


在沒有使用函數時執行計划

在使用RTRIM時的執行計划

 

 
在使用LTRIM的執行計划


 

 

 

總結

所以,從上面的例子上可以看出RTRIM,LTRIM 雖然不會讓索引徹底失效,但是會讓從索引查找變成索引掃描。說明TRIM函數對索引的使用是有影響的。
如果以后有where篩選的情況,可以去掉RTRIM 。對於Ltrim根據具體的情況,看能否避免。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM