前后%是否有建立索引的必要?

USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
	id INT IDENTITY(1,1),
	[name] NVARCHAR(20) NOT NULL,
	CONSTRAINT pk_t PRIMARY KEY(
		id	
	)
)
GO
;WITH cte AS(
	SELECT 1 AS id FROM [master].dbo.spt_values AS sv WHERE sv.[type]='P' AND sv.number BETWEEN 1 AND 1000	
)
--插入1000万条数据
INSERT INTO t([name])
SELECT left(NEWID(),20) FROM cte AS a CROSS APPLY cte AS b CROSS APPLY (SELECT TOP 10 id FROM cte) AS c
GO
CREATE INDEX ix_t_name ON t(name)
GO

SET STATISTICS IO ON
SET STATISTICS TIME ON


--1. 默认查询
--Select 0% <- Parallelism 7% <- Index Scan 93%
SELECT * FROM t WHERE NAME LIKE '%abcd%'
/*
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(920 行受影响)
表 't'。扫描计数 5,逻辑读取 68037 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

 SQL Server 执行时间:
   CPU 时间 = 37406 毫秒,占用时间 = 9836 毫秒。
*/

--2. 强制表扫描
--Select 0% <- Parallelism 7% <- Clustered Index Scan 93%
SELECT * FROM t WITH(INDEX=PK_t)WHERE NAME LIKE '%abcd%' 
/*
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(920 行受影响)
表 't'。扫描计数 5,逻辑读取 70972 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

 SQL Server 执行时间:
   CPU 时间 = 37187 毫秒,占用时间 = 10095 毫秒。
*/

------------------- 将字符长度更新为10 --------------------
UPDATE t SET [name]=LEFT(name,10)

--1. 默认查询
--Select 0% <- Parallelism 7% <- Index Scan 93%
SELECT * FROM t WHERE NAME LIKE '%abcd%'
/*
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(746 行受影响)
表 't'。扫描计数 5,逻辑读取 68137 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

 SQL Server 执行时间:
   CPU 时间 = 20375 毫秒,占用时间 = 5664 毫秒。
*/

--2. 强制表扫描
--Select 0% <- Parallelism 7% <- Clustered Index Scan 93%
SELECT * FROM t WITH(INDEX=PK_t)WHERE NAME LIKE '%abcd%' 
/*
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(746 行受影响)
表 't'。扫描计数 5,逻辑读取 70964 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

 SQL Server 执行时间:
   CPU 时间 = 20046 毫秒,占用时间 = 5724 毫秒。
*/

/*******************************************
 * 总体来说:
 * 1. 前后%只能索引扫描,即使建立了索引,效果也比较有限;
 * 2. 字段的长度缩短有助于提高查询效率。
 *******************************************/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值