分区在一个实例不同数据库创建相同的表,数据库没有其他消耗,分别在有聚集索引和堆表中进行插入测试
A/B两个库 对应A/B表
create table A
(
id int identity(1,1),
str1 char(100) default replicate('a',100),
str2 varchar(2000) default replicate('b',500),
str3 varchar(2000) default replicate('c',1000)
)
go
insert into A default values
go 1000000
在B库 B表 id 上添加聚集索引
插入速度对比
堆表中耗时:18:12
聚集表中耗时:06:49
首先压缩B表(page最大限度压缩):
压缩前
差距很大哦!
聚集索引逻辑读数=表的页数
(1000000 行受影响)
表 'testbp1'(B表)。扫描计数 1,逻辑读取 1708 次,物理读取 0 次,预读 14 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
(1 行受影响)
表: 'testbp1' (1605580758);索引 ID: 1,数据库 ID: 8
已执行 TABLE 级别的扫描。
- 扫描页数................................: 1702
- 扫描区数..............................: 215
- 区切换次数..............................: 214
- 每个区的平均页数........................: 7.9
- 扫描密度 [最佳计数:实际计数].......: 99.07% [213:215]
- 逻辑扫描碎片 ..................: 0.24%
- 区扫描碎片 ..................: 1.86%
- 每页的平均可用字节数.....................: 11.1
- 平均页密度(满).....................: 99.86%
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
A堆表
(1000000 行受影响)
表 'testbp'。扫描计数 1,逻辑读取 200000 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
(1 行受影响)
A表:
表: 'testbp' (325576198);索引 ID: 0,数据库 ID: 10
已执行 TABLE 级别的扫描。
- 扫描页数................................: 200000
- 扫描区数..............................: 25006
- 区切换次数..............................: 25005
- 每个区的平均页数........................: 8.0
- 扫描密度 [最佳计数:实际计数].......: 99.98% [25000:25006]
- 区扫描碎片 ..................: 0.03%
- 每页的平均可用字节数.....................: 1.0
- 平均页密度(满).....................: 99.99%
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
差距哦!
在A 表添加id字段添加聚集索引分别插入1万行数据:
结果未压缩4S 插入完
压缩后的插入十几分钟还未完 最后两次ssms未响应二失败,cpu往上飙,很明显是要解压缩造成的,只能说查询的话,绝对给力,插入就不行啦
测试下压缩索引:(压缩后的表创建索引也会慢)
首先只能在a表测试了压缩和未压缩比较 我这里用top100000
未加索引:
SET STATISTICS IO ON
select TOP 100000 [id],[str3] FROM [dbo].[testbp] WHERE [str2] IS NOT NULL AND [str1] IS NOT NULL ORDER BY [str1] DESC
(100000 行受影响)
表 'testbp'。扫描计数 1,逻辑读取 22518 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
(1 行受影响)
未压缩之前插入1千行对比:2:22
回滚压缩非聚集索引对比:2:34 还是可以看得出的哦,当然用压缩索引还是会使查询加快 对插入还是有点耗资源