转载自:http://www.2cto.com/database/201305/214967.html

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的性能最佳

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

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

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

  2. CHARINDEX,PATINDEX,STUFF函数

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

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

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

  4. sqlserver中的CHARINDEX用法

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

  5. [转载]sqlserver、Mysql、Oracle三种数据库的优缺点总结

    一.sqlserver优点:易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能.与许多其他服务器软件紧密关联的集成性.良好的性价比等:为数据管理与分析带来了灵活性,允许单位在快速变化的环境中 ...

  6. 转载 sqlserver 锁的概念

    SQL server共享锁,排他锁,更新锁的使用   上一篇 / 下一篇  2009-11-08 00:29:17 / 个人分类:数据库 查看( 889 ) / 评论( 0 ) / 评分( 0 / 0 ...

  7. SqlServer之like、charindex、patindex(转载)

    SqlServer之like.charindex.patindex   1.环境介绍 测试环境 SQL2005 测试数据 200W条   2.环境准备 2.1建表 CREATE TABLE [dbo] ...

  8. SqlServer之like、charindex、patindex 在有无索引的情况下分析

    1.环境介绍 测试环境 SQL2005 测试数据 200W条 2.环境准备 2.1建表 CREATE TABLE [dbo].[Depratments](         [Dep_id] [int] ...

  9. SQL语句大全(mysql,sqlserver,oracle)

    SQL语句大全 --语句功能--数据操作SELECT --从数据库表中检索数据行和列-selectINSERT --向数据库表添加新数据行-insertDELETE --从数据库表中删除数据行-del ...

随机推荐

  1. jvm参数设置

    -Xss: 栈大小 -Xms:堆初始化大小-Xmx:堆最大大小-XX:NewSize=n:设置伊甸区大小-XX:NewRatio=n:年轻代与年老代比值.如:为3,表示年轻代与年老代比值是1:3,   ...

  2. HTML5 canvas 绘制五星红旗

    这个例子并不是自己写的,在网上找的案列,仿照写的,,,自己真的公布董这些算法,看完这个例子还是有一点模糊,,, 如果谁看的比较明白,指点一下,,,多谢!!!! <!doctype html> ...

  3. Mysql主从复制的配置(双机互为主从)

    目的: 让两台mysql服务器可以互为主从提供同步服务. 优点: 1. mysql的主从复制的主要优点是同步"备份", 在从机上的数据库就相当于一个(基本实时)备份库. 2. 在主 ...

  4. 通过SERVICES的方式往商品列表FINDER加入多个ACTION

    类似这样的效果: 首先我们需要在自己的app下的services.xml加入一个service: <!-- b2c商品信息 扩展actions --> <service id=&qu ...

  5. 使用js 在IE和火狐firfox 里动态增加select 的option

    使用js 在IE和火狐firfox 里动态增加select 的option <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transition ...

  6. 剑指offer之O(1)算法删除指针所指向的节点

    题目如图: 1.把要删除pToBeDeleted的节点的后面节点覆盖点要删除的节点pToBeDeleted 2.要考虑如果删除的节点是最后一个节点怎么办 3.要考虑如果总共只有一个节点,删除的是头结点 ...

  7. 使用__autoload()来管理文件导入

    其基本思想是把要使用到的其他资源文件统一使用__autoload()方法来管理,我们在使用的时候只需要引入包含__autoload()方法的文件即可.其对性能的影响是微乎其微的,但是带来的好处是巨大的 ...

  8. Storm测试报告

    http://blog.csdn.net/jmppok/article/details/17614431

  9. C++中对sprintf()函数的说明(转)

    在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望.由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出 ...

  10. rsyslog 读取单个文件测试

    rsyslog 测试(rsyslog 必须yum 安装uat-web02:/root# rpm -qa | grep rsyslog rsyslog-8.21.0-1.el6.x86_64) //读取 ...