首页 > 嗟来之食 > 关于TRIM的优化技巧
2017
08-01

关于TRIM的优化技巧

背景
今天在论坛中,看到有人在问一个千万级别表查询的优化。一个简单的查询几分钟。语句如下
SELECT  work_date ,        major ,        style ,        jo_key_seq ,        component ,        qty ,        bundle_id ,        jo_sku_key_seqFROM    dbo.rfid_transaction_tableWHERE   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根据具体的情况,看能否避免。

最后编辑:
作者:
这个作者貌似有点懒,什么都没有留下。

留下一个回复