dbcc showcontig查看表页面碎片程度

本文通过实例演示了SQL Server中数据文件碎片的程度及其对查询性能的影响,并展示了如何通过索引重建来减少碎片并提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例代码:

 

ExpandedBlockStart.gifView Code
-- 数据文件里的碎片程度
use tempdb
go
drop table demo
go
create table demo (
int,
char(990))
go
create clustered index demo_index on demo (a)
go
--我们在表格里插入1000条记录。记录会占据125个页面。
declare @i int
set @i = 0
while @i < 1000
begin
insert into demo values (@i'abcd')
set @i = @i + 1
end
go
dbcc showcontig(demo)
go

DBCC SHOWCONTIG 正在扫描 'demo' 表...
表: 'demo' (165575628);索引 ID: 1,数据库 ID: 2
已执行 TABLE 级别的扫描。
- 扫描页数................................: 125------b为char(990),一行大概为1K字符,一页为8K,所以总插入大概为1000K,(125页)
- 扫描区数..............................: 21----一个区为64K,即8页。
- 区切换次数..............................: 21
- 每个区的平均页数........................: 6.0
- 扫描密度 [最佳计数:实际计数].......: 72.73% [16:22]
- 逻辑扫描碎片 ..................: 5.60%
- 区扫描碎片 ..................: 19.05%
- 每页的平均可用字节数........................: 72.0
- 平均页密度(满).....................: 99.11%  页密度很高,说明页面碎片少
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

 

 

ExpandedBlockStart.gifView Code
--然后我们每8条记录删除7条记录。这样在每个页面里,只会保存有一条记录。
--
这时候页面里的大部分空间都是空闲的。通常我们说这种页面里碎片比较严重
declare @i numeric(6,2--numeric 精度值
set @i=0
while @i<1000
begin
  
if @i/8<> convert(int ,@i/8)
  
delete demo where a=@i
  
set @i=@i+1
end
go 
select * from demo
go 
dbcc showcontig(demo)


DBCC SHOWCONTIG 正在扫描 'demo' 表...
表: 'demo' (165575628);索引 ID: 1,数据库 ID: 2
已执行 TABLE 级别的扫描。
- 扫描页数................................: 125
- 扫描区数..............................: 21
- 区切换次数..............................: 21
- 每个区的平均页数........................: 6.0
- 扫描密度 [最佳计数:实际计数].......: 72.73% [16:22]
- 逻辑扫描碎片 ..................: 5.60%
- 区扫描碎片 ..................: 19.05%
- 每页的平均可用字节数........................: 7093.0
- 平均页密度(满).....................: 12.37% 页面仍为125,而密度很低,说明碎片很多了
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

 

ExpandedBlockStart.gifView Code
set statistics io on 
go 
select * from demo
go 
set statistics io off
go 
--表 'demo'。扫描计数 1,逻辑读取 127 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
只有125条记录,但是sql读取了127个页面

alter index ixdemoA on demo rebuild
go 
set statistics io on
select * from demo
set statistics io off 
--表 'demo'。扫描计数 1,逻辑读取 18 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
索引重建后,只需18页了,节省6/7 

 

 

 

 

转载于:https://www.cnblogs.com/gaiyang/archive/2011/07/12/2104075.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值