背景

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

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 調(diào)整索引 2.不要在style字段上使用函數(shù)。今天先不管索引的調(diào)整,對于第二點,他使用了RTRIM。今天分享下RTRIM知識點和相關(guān)的優(yōu)化技巧。

 

回到頂部

案例

 

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' 查詢結(jié)果是一樣的

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

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


回到頂部

對索引的影響

 

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


在沒有使用函數(shù)時執(zhí)行計劃
 
在使用RTRIM時的執(zhí)行計劃
 
在使用LTRIM的執(zhí)行計劃
 

 

回到頂部

總結(jié)

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

http://www.cnblogs.com/OwenZeng/p/7189536.html