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. 字段的长度缩短有助于提高查询效率。
*******************************************/
前后%是否有建立索引的必要?
最新推荐文章于 2021-05-13 18:29:08 发布