必威体育Betway必威体育官网
当前位置:首页 > IT技术

SqlServer之like、charindex、patindex区别及性能分析(转载)

时间:2019-10-10 08:46:04来源:IT技术作者:seo实验室小编阅读:66次「手机版」
 

patindex

第一篇文章

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

3)patindex 支持匹配表达式,可以应用正则;

select count(*) from depratments where patindex('%[1-5]',Dep_name)>0;,

其他如:[^e]:不包含"e"的....

4)like可以用'%oldstring%'进行模糊匹配;

5)charindex只能匹配固定字符串

转载自:http://www.cnblogs.com/xiexingen/p/3739414.html

第二篇文章:

MS_SQL模糊查询like和charindex的对比

like查询效率低下,网上搜了一下替代like查询的方法,都是说用charindex方法,自己对比了一下查询速度

test1表中有一千两百多万条数据,我只给ID加了索引

先看一下 '%我%'这种模糊查询:

复制代码

declare @q datetime
set @q = getdate()
select ID,U_Name,U_Sex,U_Age,U_Address from test1 where U_Name like '%我%'
select [like执行花费时间(毫秒)]=datediff(ms,@q,getdate())

declare @w datetime
set @w = getdate()
select ID,U_Name,U_Sex,U_Age,U_Address from test1 where charindex('我',U_Name) >0
select [charindex执行花费时间(毫秒)]=datediff(ms,@w,getdate())

复制代码

查询结果:

两者的时间差不多,不过要是在千万、乃至上亿的数据中还是能明显感觉到两者的查询速度吧。

再看下'我%'这种的模糊查询:

复制代码

declare @q datetime
set @q = getdate()
select ID,U_Name,U_Sex,U_Age,U_Address from test1 where U_Name like '我%'
select [like执行花费时间(毫秒)]=datediff(ms,@q,getdate())

declare @w datetime
set @w = getdate()
select ID,U_Name,U_Sex,U_Age,U_Address from test1 where charindex('我',U_Name) >0
select [charindex执行花费时间(毫秒)]=datediff(ms,@w,getdate())

复制代码

查询结果:

次奥!谁说charindex的效率比like高的?砍你丫的!

所以需要在不同条件下选择两种模糊查询,'%我%'这种的就用charindex,'我%'这种的就用like!

转载自:http://www.cnblogs.com/New-world/archive/2012/11/28/2793560.html

相关阅读

OutputStreamWriter、PrintWriter和BufferedWriter区

一、是否有无追加模式(是否从已有文件末尾追加) OutputStreamWriter:有 PrintWriter:无 BufferedWriter:有 二、是否能能控制编码

text/html和text/plain的区别

text/html和text/plain的区别1、text/html的意思是将文件的content-type设置为text/html的形式,浏览器在获取到这种文件时会自动调

setBackground(),setBackgroundResource(),setBackgro

setBackground(),setBackgroundResource(),setBackgroundColor()和setBackgroundDrawable()这几个方法都可以对控件的颜色进行设

人机交互 (HCI) 和交互设计 (Interaction Design) 的

作为一个PM当然非常需要注重产品在使用过程中的一些交互体验,可是广义的人机交互和交互设计又有什么区别呢?让我们来看看知乎里别人

C#里面Console.Write()和Console.WriteLine()有什么区别

  Console.Write()和Console.WriteLine()都是System.Console提供的方法,两着主要用来将输出流由指定的输出装置(默认为屏幕)显

分享到:

栏目导航

推荐阅读

热门阅读