關於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‘
我給他的建議是: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(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‘
對索引的影響
我們都知道對字段使用函數會使字段上的索引失效。那麽RTRIM 和 LTRIM 會使用索引失效嗎?我們用
SELECT [DocumentID] ,
[Title]
FROM [AdventureWorks].[Production].[Document]
WHERE Title = ‘Crank Arm and Tire Maintenance‘
在沒有使用函數時執行計劃
在使用RTRIM時的執行計劃
在使用LTRIM的執行計劃
總結
所以,從上面的例子上可以看出RTRIM,LTRIM 雖然不會讓索引失效,但是會讓從索引查找變成索引掃描。說明TRIM函數對索引的使用還是有影響。
如果以後有where篩選的情況,可以去掉RTRIM 。對於Ltrim根據具體的情況,看能否避免。
關於TRIM的優化技巧