zoukankan      html  css  js  c++  java
  • 关于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'
            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根据具体的情况,看能否避免。

  • 相关阅读:
    抽卡 状压DP+期望DP+系数递推
    20190903考试反思
    20190823考试反思
    约瑟夫类问题研究
    树位DP
    20190823考试反思
    20190820考试反思
    20190818考试反思
    20190817考试反思
    PowerBuilder--Aes128加解密
  • 原文地址:https://www.cnblogs.com/OwenZeng/p/7189536.html
Copyright © 2011-2022 走看看