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. vim操作备忘录

    vim操作备忘录 vim 备忘录 vim的书籍虽然看不不少,可是老是容易忘记,主要是自己操作总结过少,这个博客就主要用来记录一些比较常见的术语和操作,以防止自己再次忘记. <leader> ...

  2. AC Dream1069

    这题的加密字符 - (Fibnacci % 26),如果得到的字符小于'a',就等于加密字符 - (Fibnacci % 26)+26. 获得题目的函数如下: void getItem(){ char ...

  3. svn版本管理系统出现的问题解决办法

    首先会出现下面的一个提示错误: cannot checkout from svn run 'cleanup' if it was interrupted 百度加谷歌找到的解决问题的办法各种各样,自己遇 ...

  4. spider RPC更新至2.0.0-RELEASE

    spider使用java语言开发,使用Spring作为IoC容器,采用TCP/IP协议,在此基础上,结合SaaS金融交易系统的特性进行针对性和重点设计,以更加灵活和高效的满足金融交易系统多租户.高可用 ...

  5. Linux中select poll和epoll的区别

    在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select.poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加 ...

  6. 阿里云服务器部署笔记一(python3、Flask、uWSGI、Nginx)

    一.重置密码,并重启服务器 二.安全组配置>配置规则>添加安全组规则(为了能在本地ssh到实例) 配置如下: 此配置为允许任意公网IP登陆实例,注意windows与Linux系统端口范围不 ...

  7. mongodb一些使用技巧或注意事项记录

    1.有的时候需要删除指定字段那一列,使用update操作.例如要删除name这一列: query  json: {"name":{$exists:true}} update jso ...

  8. R语言︱SNA-社会关系网络 R语言实现专题(基础篇)(一)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:这里所有的应用代码都来自与igrap ...

  9. dojo省份地市级联之省份Dao接口类(三)

    dojo省份地市级联之省份Dao接口类 ProvinceDao.java: /** * 省份-Dao */ package com.you.dao; import java.util.List; im ...

  10. Struts2实现文件上传(一)

    Struts2实现文件上传 文件上传成功后结果页面 result.jsp: <%@ page language="java" import="java.util.* ...