背景
今天在論壇中,看到有人在問一個千萬級別表查詢的優(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