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. Java经典编程题50道之二十五

    一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. public class Example25 {    public static void main(Stri ...

  2. C/C++语言的语法基础

    数据类型指明变量或表达式的状态和行为,数据类型决定了数的取值范围和允许执行的运算符集.c++语言数据类型可以分为两大类:基本类型和引用类型.基本类型是指不能再分解的数据类型,其数据在函数的调用中是以传 ...

  3. bzoj 1814 Ural 1519 Formula 1 插头DP

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 942  Solved: 356[Submit][Sta ...

  4. jsz中的作用域与上下文

    var x=10; function fun() { console.log(x);//10 } function demo(f) { if(f instanceof Function){ fun() ...

  5. 韩信点兵(hanxin)

    相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入包含多组数据,每组数据包含3个非负整数a,b,c,表 ...

  6. Java集合框架(五)—— Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap

    Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据.Map的ke ...

  7. uva437 DAG

    直接套用DAG的思路就行. AC代码: #include<cstdio> #include<cstring> #include<algorithm> using n ...

  8. TCP/IP卷一没提到的策略路由

    策略路由 tcp/ip书上介绍了选路和动态路由,没有提及策略路由,应该是因为那个年代还不存在策略路由吧,但是这是个很有用的东西. 背景 昨天领导做了一个虚拟机,里面配了两个网络172.16.50.33 ...

  9. DTCMS插件的制作实例电子资源管理(四)URL重写

    总目录 插件目录结构(一) Admin后台页面编写(二) 前台模板页编写(三) URL重写(四) 本实例旨在以一个实际的项目中的例子来介绍如何在dtcms中制作插件,本系列文章非入门教程,部分逻辑实现 ...

  10. Jmeter_beanshell实现字符串加密

    Jmeter内置的没有MD5加密方法,所以需要写一些java代码实现加密功能,以下是具体操作: 1:用eclipse建个工程(包名.类名.方法名自己起) package com.wjika.test; ...