1. 程式人生 > >關於TRIM的優化技巧

關於TRIM的優化技巧

sel 分享 target tle afa title 軟件 級別 ref

背景

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

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根據具體的情況,看能否避免。

關於TRIM的優化技巧