zoukankan      html  css  js  c++  java
  • charindex代替like并非"更快更全面"

        最近csdn的编辑们在社区和网站首页的标题让人有些受不了,一个吸引眼球的大红专题点进去只是一个聊聊数字的普通帖子..这种做法用来八卦也就算了,用来包装技术文章那是相当不负责的。

        一个普普通通的技术博文,不管观点对错,水平如何,作者的拿出来分享的做法是值得肯定的,但在没有经过论证,人为在加上一个漂亮的副标题打到技术专区的首页上,难免误导不明真相的群众。

       

    文章出处

        http://database.ctocio.com.cn/336/9159836.shtml

    大概这就叫传说中的以讹传讹,就算作者认为他的方法更全面,人家也没有说更快...

    别的不扯了,我写此文的目的以来是为了督促一下csdn官方,发布在首页上的文章要仔细审核,起码得专业精神还是需要的。二来让不明白真相的群众明白一下。我们就从更快更全面说开来:

    首先:先明确掉全面这个问题,想like百分号很简单,帮助文档里面就有

    ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/581fb289-29f9-412b-869c-18d33a9e93d5.htm

    转义百分号类似下面方法:

    select * from
    (select 'a%b' as s union select 'ab' )t
    where s like '%/%%' escape '/' ;

    反而,like可以实现比charindex更复杂的通配功能,比如partindex函数才支持的方括号

    select * from (select 'amm_99' as s union select 'happyflystone' ) t
    where s like '%[0-9]%'

    然后:说一下是否更快,这个需要有测试数据,不是我相信快就快的,sql优化结果谁都无法预料。我在windows2008+sqlserver2005中的测试结果是没有索引一样快,有索引like快。

    特别强调一下虽然是%%的like,索引还是起作用的。

    测试数据如下:

    use tempdb
    go
    if (object_id ('t_test' )> 0 )drop table t_test
    go
    create table t_test (f1 varchar (100 ), f2 varchar (100 ), f3 varchar (100 ))
    go
    insert into t_test select newid (), newid (), newid ()
    go 1000

    create index i_test on t_test (f1 )
    go

    我们看两组sql语句的查询计划

    第一组是:

    select * from t_test where f1 like '%abc%'
    select * from t_test where charindex ('abc' , f1 )> 0

    结果如下:

    很明显是like因为有索引扫描(rid是行标志符)而速度快于charindex,这里我们需要理解表扫描,索引扫描和索引查找的区别。为了说明这个问题,我们再看一下 like 'abc%'和charindex('abc',f1)=1的区别。

    如果你测试一下,就会知道,charindex('abc',f1)=1和charindex('abc',f1)>0的效率是一样的。这样我们就能看出来,索引查找要比索引扫描快,索引扫描要比表扫描快。大概解释一下我个人的理解,索引的存储方式是一个特定数据结构的树,查找可以被优化,不必遍历整个树的所有节点所以最快,而索引扫描需要遍历所有树的节点所以稍慢但仍然要比表扫描快。

  • 相关阅读:
    Java基础知识面试题(2021年最新版,持续更新...)整理
    windows10 cmd窗口输出卡住(看这篇就够了)
    windows10 powershell窗口输出卡住(看这篇就够了)
    Golang函数相关
    内存对齐详解
    Go编程模式Pipeline
    管道符、重定向与环境变量(Linux就该这么学第三章)
    GMP模型简介
    新手必须掌握的Linux命令(Linux就该这么学第二章)
    Goland运行项目报错:CreateProcess error=216, 该版本的 %1 与你运行的 Windows 版本不兼容。请查看计算机的系统信息,然后联系软件发布者。
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6204808.html
Copyright © 2011-2022 走看看