|
我看ms sql server 2000 (19)- 填充因子与oracle的pctfree ?
我曾经就这个问题问过一个ms sql server的程序员,我仅仅记得他告诉我,ms sql server下你不需要优化,现在想想不知者无畏! 做一个例子测试看看,举一个极端的例子:
create table t1 ( id int ,a varchar(4),b varchar(2000))
commit ;
[注意:我使用char类型,好象即使是NULL,也占用空间]
每个字段分别建立索引,名字为pk_t1_id,ix_t1_a,其中聚集索引字段id.ix_t1_a的索引字段为a.
set statistics io off
set implicit_transactions on
declare @vid int
Select @vid = 1
While @vid <=16
Begin
insert into t1 values(@vid , convert(varchar(4),@vid) , NULL)
Select @vid = @vid + 1
end
set statistics io on
select * from t1
commit
IO统计:
表 't1'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。
可以发现数据在一个块里面.
set statistics io on
set implicit_transactions on
select * from t1 where a='5'
IO统计:
表 't1'。扫描计数 1,逻辑读 3 次,物理读 0 次,预读 0 次。
set statistics io off
set implicit_transactions on
declare @vid int
Select @vid = 1
While @vid <=8
Begin
set statistics io off
update t1 set b='1'+space(1998)+'1' where id = @vid *2
commit
Select @vid = @vid + 1
set statistics io on
select * from t1
set statistics io off
end
set statistics io on
select * from t1
commit
IO统计:
表 't1'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 3 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 3 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 3 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 4 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 4 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 4 次,物理读 0 次,预读 0 次。
可以发现T1表变化了.
set statistics io off
set implicit_transactions on
declare @vid int
Select @vid = 1
While @vid <=8
Begin
set statistics io off
update t1 set b='1'+space(1998)+'1' where id = @vid *2 -1
commit
Select @vid = @vid + 1
set statistics io on
select * from t1
set statistics io off
end
set statistics io on
select * from t1
commit
表 't1'。扫描计数 1,逻辑读 5 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 5 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 5 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 5 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 6 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 6 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 6 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 6 次,物理读 0 次,预读 0 次。
表 't1'。扫描计数 1,逻辑读 6 次,物理读 0 次,预读 0 次。
可以发现,合理的设置还是很重要的,实际上这个与oracle的pctfree一样,必须可以的设置.
再次查询,发现以下逻辑读是否变化,发现没有.
set statistics io on
set implicit_transactions on
select * from t1 where a='5'
IO统计:
表 't1'。扫描计数 1,逻辑读 3 次,物理读 0 次,预读 0 次。
我的猜测如果块分裂很厉害,或许逻辑读 会有变化,这个主要问题还是集中在非聚集索引保存聚集索引键值外+还包括什么?
也许最好的方法就是dump 块. |
|