SqlServer之like、charindex、patindex
 
1、环境介绍
测试环境 SQL2005
测试数据 200W条
 
2、环境准备
2.1建表
CREATE TABLE [dbo].[Depratments](
        [Dep_id] [int] NOT NULL,
        [Dep_name] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
2.2创建数据
create procedure ins_Depratments
as
        declare @n int;
        declare @title varchar(30);
        set @n =1;
        set @title='';
begin
        while @n<2000000
        begin
               -- set @title = (select case when (cast(floor(rand() * 6) as int)) =5 then '部门经理' else '职员'end);
                insert into Depratments (Dep_id,Dep_name) values (@n,'开发'+CAST(@n as varchar)) ;
               -- insert into employees values (@n,'刘备'+CAST(@n as varchar),'男',@title,
                       78000,'11110333x'+CAST(@n as varchar),@n,getdate());
               set @n=@n+1;
        end
end
2.3执行        exec ins_Depratments
 
3、场景
3.1前后都有百分号的查询
SET STATISTICS IO ON
set statistics time ON 
go
select count(*) from depratments where Dep_name like '%开发1000%';
go  
select count(*) from depratments where charindex('开发1000',Dep_name)>0;
go
select count(*) from depratments where patindex('%开发1000%',Dep_name)>0;
go
无索引的情况 charindex > patindex > like
        CPU 时间 = 4391 毫秒,占用时间 = 5322 毫秒。
        CPU 时间 = 3812 毫秒,占用时间 = 4690 毫秒。
        CPU 时间 = 4047 毫秒,占用时间 = 5124 毫秒。
带索引的情况 charindex > patindex > like
       CPU 时间 = 4297 毫秒,占用时间 = 4535 毫秒。
       CPU 时间 = 3844 毫秒,占用时间 = 4024 毫秒。
       CPU 时间 = 4219 毫秒,占用时间 = 4351 毫秒。
结论:
当前后都使用百分号的情况(%string%),①charindex性能稍微好点,like、patindex性能相近;②索引在这种情况中失效 
3.2百分号在后面的查询
SET STATISTICS IO ON
set statistics time ON 
go
select count(*) from depratments where Dep_name like '开发1000%';
go
select count(*) from depratments where charindex('开发1000',Dep_name)>0;
go
select count(*) from depratments where patindex('开发1000%',Dep_name)>0;
go
 
无索引的情况 patindex > like > charindex
        CPU 时间 = 844 毫秒,占用时间 = 1465 毫秒。
        CPU 时间 = 3875 毫秒,占用时间 = 3914 毫秒。
        CPU 时间 = 968 毫秒,占用时间 = 969 毫秒。
 
带索引的情况  like > patindex > charindex
        CPU 时间 = 0 毫秒,占用时间 = 18 毫秒
        CPU 时间 = 3766 毫秒,占用时间 = 4026 毫秒。
        CPU 时间 = 937 毫秒,占用时间 = 983 毫秒。
结论:
无索引的情况,patindex的性能最佳,是charindex性能的4倍
带索引的情况,like的性能最佳
 
总结:
①索引只适用于百分号在后面的情况(string%)
②在前后都是百分号的情况下charindex 的性能最佳
③百分号在后面的查询,无索引的情况,patindex的性能最佳
 

3)patindex 支持匹配表达式,可以应用正则;select count(*) from depratments where patindex('%[1-5]',Dep_name)>0;,其他如:[^e]:不包含"e"的....

4)like可以用'%oldstring%'进行模糊匹配;

5)charindex只能匹配固定字符串

SqlServer之like、charindex、patindex(转载)的更多相关文章

  1. SqlServer中的merge操作(转载)

    SqlServer中的merge操作(转载)   今天在一个存储过程中看见了merge这个关键字,第一个想法是,这个是配置管理中的概念吗,把相邻两次的更改合并到一起.后来在technet上搜索发现别有 ...

  2. SQLServer内核架构剖析 (转载)

    SQL Server内核架构剖析 (转载) 这篇文章在我电脑里好长时间了,今天不小心给翻出来了,觉得写得很不错,因此贴出来共享. 不得不承认的是,一个优秀的软件是一步一步脚踏实地积累起来的,众多优秀的 ...

  3. 关于字符串查找 charindex ,Patindex 还有一个like

    字符串查找.在模糊朝找的情况下,其实3者的效率是差不多的.都需要一个一个取出来然后扫一遍╮(╯_╰)╭.然而用法还是会有一点儿的区别 1 charindex (查找的字符串,字符串表达式[,开始查找的 ...

  4. CHARINDEX,PATINDEX,STUFF函数

    -- CHARINDEX函数 -- 返回字符或者字符串在另一个字符串中的起始位置. -- 语法:CHARINDEX(expression1 , expression2 [,start_location ...

  5. T-SQL like charindex patindex 性能比较

    事实上在网上可以找到很多这方面的资料,在这边就不多说了~主要观点在性能方面还是比较倾向于charindex,下面就测试下: 测试环境:共50批次,每批次50000数据,测试总共250万数据. 一.li ...

  6. sqlserver中的CHARINDEX用法

    CHARINDEX作用 写SQL语句我们经常需要判断一个字符串中是否包含另一个字符串,但是SQL SERVER中并没有像C#提供了Contains函数,不过SQL SERVER中提供了一个叫CHAEI ...

  7. sqlserver 汉字转拼音(转载)

    转载来源一:https://www.cnblogs.com/zhuisuo/archive/2012/01/11/2318908.html 汉字转全拼音函数优化方案(SQLServer),值得你看看 ...

  8. 使用SQLCMD在SQLServer执行多个脚本 转载

    出处不明 概述: 作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个sql文件,并且有执行顺序,如我现在工作的公司 ...

  9. SqlServer 全文索引指令大全(转载)

    -- 创建测试表 -- DROP TABLE FullTextIndexing CREATE TABLE FullTextIndexing ( ID ,) NOT NULL, Sentence VAR ...

随机推荐

  1. Expression Language

    EL找不到属性会返回"" page –-  request --- session --- application ------------------------------- ...

  2. win7本地搭建git ssh服务器

    本来是想在gogs上用ssh的,结果弄了好几次还没整明白,希望等他们的更新内置吧. 但是,意外收获,还是成功搭建了本地ssh服务器,只是没有和gogs成功关联. 简要记录一下: 主要软件: msysg ...

  3. 百度ueditor富文本编辑器的使用

    百度ueditor富文本编辑器的使用 //以下为我在官网下载的ueditor v1.3.5 php版的大楷配置步骤第一步: //配置文件的引入应该比功能文件先引入,最后设置语言类型.即:editor. ...

  4. 数组序列的capacity及size函数

    #include<iostream>#include<vector>using namespace std;int main(){    vector<int> i ...

  5. 面试题之 query转为obj

    要注意处理编码后的字串  对于a=123要得到number形的值 function parseQueryString(url) { var obj = {}; var query = url.sear ...

  6. 在PADS LAYOUT中修改所有元件字体的大小,怎么修改?

    1.选中一个字符,Ctrl+Q查看一下属性,是在哪一层. 2.Ctrl+Alt+F(Filter)打开滤波器选项,点Layer,将除字符所在层之外的层全部关掉,即将其前面的"√"去 ...

  7. WA(Write Amplification)写入放大

    WA是闪存及SSD相关的一个极为重要的属性.由于闪存必须先擦除才能再写入的特性,在执行这些操作时,数据都会被移动超过1次.这些重复的操作不单会增加写入的数据量,还会减少闪存的寿命,更吃光闪存的可用带宽 ...

  8. python 入门快速学习整理

    Python 入门学习 1  : 对象类型 1 1.1 列表 1 1.2 字典 2 1.3 元组 2 1.4 元组 2 1.4 文件 3 2  : 条件和循环语句 3 2.1  if else语句 3 ...

  9. OpenStack里的浮动ip

    缺省情况下实例会被赋予固定ip,这时并不能保证实例会马上可以从外面访问到,一般来说需要配置防火墙来允许公共ip,然后建立一条NAT规则从公共ip到私有ip的映射.OpenStack引入了一个叫浮动ip ...

  10. SGU 201 Non Absorbing DFA (DP)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题意:给出一个自动机,给出所有的转移,其中还有一个 ...