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. spring core 与 context理解

    Spring core是核心层,拥有这BeanFactory这个强大的工厂,是所有bean的管理器: 而spring context是上下文运行环境,基于spring core之上的一个架构, 它之上 ...

  2. R语言包的安装

    pheatmap包的安装 1: 首先R语言的安装路径里面最好不要有中文路径 2: 在安装其他依存的scales和colorspace包时候要关闭防火墙 错误提示: 试开URL'https://mirr ...

  3. C语言_简单了解一下typedef

    作为一名PHPer,了解一下C还是有必要的,只是做一个简单的了解,因为并没有做开发C的想法. 关于typedef的详细说明,网上搜过了很多帖子,这篇算是最详细的了:http://blog.csdn.n ...

  4. MysqL主主复制_模式之日志点复制

    主主复制即在两台MySQL主机内都可以变更数据,而且另外一台主机也会做出相应的变更,可以起到一定的压力分担等作用. 测试两台虚拟机IP分别为: 192.168.136.131.192.168.136. ...

  5. 如何遍历 Windows 摄像头设备?

    #include <stdlib.h> #include <iostream> #include <Windows.h> #include <comdef.h ...

  6. PhpStorm如何下载github上的代码到本地

    1.看着菜单栏有一个VCS(Virus Capture Scripter)集群服务器的选项,选择其下面的Checkout from Version Control,然后 (1)选择GIT:输入git的 ...

  7. ajax常用实例代码总结新手向参考(一)

    http的交互方法有四种:get.post.put(增加数据).delete(删除数据) put和delete实现用的是get和post   get方式 页面不能被修改,只是获取查询信息.但是提交的数 ...

  8. python替换脚本

    任何场合都用的到的全文替换 #!/usr/bin/python import sys if len(sys.argv) < 5: print 'usage: python %s from to ...

  9. SAS︱数据索引、数据集常用操作(set、where、merge、append)

    代码部分大多来源于姚志勇老师的<SAS编程与数据挖掘商业案例>. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ ------------ ...

  10. JavaScript split()函数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...