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. sqlserver的表变量在没有预估偏差的情况下,与物理表可join产生的性能问题

    众所周知,在sqlserver中,表变量最大的特性之一就是没有统计信息,无法较为准备预估其数据分布情况,因此不适合参与较为复杂的SQL运算.当SQL相对简单的时候,使用表变量,在某些场景下,即便是对表 ...

  2. sqlserver同步后在不重新初始化快照的情况下新增表

           在已有事务复制中,时长需要新增表.索引,这些变更时不会同步到从库中.如果采用默认的设置,每次都需要重新初始化快照,从库重新应用快照和未执行的同步命令,这显然是无法在线上实践的方法.另一种 ...

  3. MongoDB学习笔记(六) MongoDB索引用法和效率分析

    MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...

  4. 关于MySQL什么时候使用索引问题以及什么情况下应不建或少建索引

    一,什么情况下使用索引1. 表的主关键字 自动建立唯一索引 2. 表的字段唯一约束 ORACLE利用索引来保证数据的完整性 3. 直接条件查询的字段 在SQL中用于条件约束的字段 如zl_yhjbqk ...

  5. MySQL索引及性能优化分析

    一.SQL性能下降的原因 查询语句问题,各种连接.子查询 索引失效(单值索引.复合索引) 服务器调优及各个参数设置(缓冲.线程池等) 二.索引 排好序的快速查找数据结构 1. 索引分类 单值索引 一个 ...

  6. 搞定面试官 - 你可以介绍一下在 MySQL 中,哪些情况下 索引会失效嘛?

    大家好,我是程序员啊粥,前边给大家分享了 *MySQL InnoDB 索引模型 在 MySQL InnoDB 中,为什么 delete 删除数据之后表数据文件大小没有变 如何计算一个索引的长度 如何查 ...

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

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

  8. sqlserver查看索引使用情况以及建立丢失的索引

    --查看表的索引使用情况SELECT TOP 1000o.name AS 表名, i.name AS 索引名, i.index_id AS 索引id, dm_ius.user_seeks AS 搜索次 ...

  9. 第十二章——SQLServer统计信息(2)——非索引键上统计信息的影响

    原文:第十二章--SQLServer统计信息(2)--非索引键上统计信息的影响 前言: 索引对性能方面总是扮演着一个重要的角色,实际上,查询优化器首先检查谓词上的统计信息,然后才决定用什么索引.一般情 ...

随机推荐

  1. 我不知道的行高——line-height

    概述 对于块级元素,CSS属性line-height指定了元素内部line-boxes的最小高度. 对于非替代行内元素,line-height用于计算line box的高度. 对于替代行内元素,如bu ...

  2. kvm的安装使用技巧

    KVM参考网址 http://www.server110.com/kvm/201403/8321.html http://www.2cto.com/os/201511/451650.html http ...

  3. 用Open SSH生成公钥和私钥(Win)

    也可以使用 dsa 加密算法进行加密,命令如下: ssh-keygen -t dsa

  4. Docker容器技术

    Docker介绍 什么是容器 Linux容器是与系统其他部分隔离开的一系列进程,从另一个系统镜像运行,并由该镜像提供支持进程所需的全部文件. 容器镜像包含了应用的所有依赖项,因而在从开发到测试再到生产 ...

  5. service不死之身

    为了应用常驻后台,避免被第三方杀掉的方法 1)Service设置成START-STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样 2)通过startForegrou ...

  6. CodeForces-747B

    在两种情况下不能得到答案:1.n不是4的整数倍 2.某个字符的数量大于n/4 如果满足上述条件直接打印"===",否则填充数组. AC代码: #include<cstdio& ...

  7. .net mvc web api 返回 json 内容时过滤值为null的属性

    1.响应内容(过滤前) {"msg":"初始化成功!","code":"","success":tr ...

  8. Linux传统Huge Pages与Transparent Huge Pages再次学习总结

      Linux下的大页分为两种类型:标准大页(Huge Pages)和透明大页(Transparent Huge Pages).Huge Pages有时候也翻译成大页/标准大页/传统大页,它们都是Hu ...

  9. FMECA分析

    FMECA是针对产品所有可能的故障,并根据对故障模式的分析,确定每种故障模式对产品工作的影响,找出单点故障,并按故障模式的严重度及其发生概率确定其危害性.所谓单点故障指的是引起产品故障的,且没有冗余或 ...

  10. Android程序启动过程深入解析

    当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样的? 什么是Linux内核? 桌面系统linux内核与Android系统linux内核有什么区别? 什么是引导装载程序 ...