类似数据集的逻辑读取数量的差异

时间:2016-07-16 18:16:26

标签: sql sql-server

在以下代码中:

create table t(i int,j char(3000))
create table t1(i int,j char(3000))

create unique clustered index ixt on t(i) with (FILLFACTOR=20)

declare @n int = 0
while @n < 1000
begin
  insert into t values(@n*2,'a')
  insert into t1 values(@n*2,'a')
  set @n = @n+1
end

create unique clustered index ixt1 on t1(i) with (FILLFACTOR=20)   

上面的两个表都有相同的结构,数据类型甚至相同的数据,但查询它们给了我不同的逻辑读取..

select * from t where i between 100 and 150 --returns 16 logical reads
select * from t1 where i between 100 and 150 --returns 30 logical reads

有人可以告诉我为什么table t1中的查询会返回比table t的查询更多的逻辑读取吗?

1 个答案:

答案 0 :(得分:5)

这是由于您创建索引的方式(首先为一个表创建,最后为一个表创建)和使用不同的填充因子设置。

填充因子,我们知道,确定索引的叶级页面中剩余多少可用空间,在这种情况下,您要求将其设置为20,这意味着剩下80%的剩余空间...

需要强调:
  Fill factor setting仅在重建或创建索引时才会受到尊重

第一种情况:
即使您创建一个填充因子为20的索引,也没有数据,因此不会留下空闲空间,我们知道插入此设置时不会受到尊重。

查询table1页面显示只有500行

 select object_name(object_id),index_depth,index_level,avg_fragmentation_in_percent,avg_page_space_used_in_percent,page_count  from 
sys.dm_db_index_physical_stats(db_id(),0,-1,0,'Detailed')
where object_id=object_id('t')

enter image description here

第二种情况:
您插入数据后将创建索引,SQL将遵循该设置,页面将重新排列以符合此设置..

Table2页数给我们1000行..

select object_name(object_id),index_depth,index_level,avg_fragmentation_in_percent,avg_page_space_used_in_percent,page_count  from 
sys.dm_db_index_physical_stats(db_id(),0,-1,0,'Detailed')
where object_id=object_id('t1')

enter image description here

即使表计数相同,由于您创建索引的方式,页面数也不同。这就是为什么您看到具有相同数据和结构的每个表的不同逻辑读取的原因

如果在重建两个索引后进行查询,则会看到相同的逻辑读取