在SQL Server中,存储数据的最小单位是页,每一页所能容纳的数据为8060字节
在SQL Server中,比页更大的单位是区(Extent).一个区可以容纳8个页.区作为磁盘分配的物理单元.所以当页分割如果跨区后,需要多次切区。
需要更多的扫描.因为读取连续数据时会不能预读,从而造成额外的物理读,增加磁盘IO.
碎片:是指对表的插入、修改和删除等物理操作 物理 索引页被分成多块就形成了索引碎片
内部碎片受页面填充度的影响,如果碎片过多使表所占的实际页面数比无碎片时多出很多。因此在表扫描时会发生更多的I/O操作,但是索引查找时不会受到很大影响。
如表一行 最大存储字节 1000byte 大致 一页就存储8行
如果更新了 这个表的每一行 导致新数据原来的行不够存储 就需重新 更新页索引
外部碎片是因为页面的逻辑顺序和硬盘上的物理顺序不一致或是分区的不连续所造成的。这时,如果使用索引进行范围查找的话,因为要按照记录的逻辑顺序进行记取,会引起磁头来回移动。
而当分页时如果新的页和当前页物理上不连续,则还会造成外部碎片
DBCC SHOWCONTIG 扫描信息
DBCC dbreindex ()--碎片整理
SELECT * FROM sys.dm_db_index_physical_stats('库ID','对象ID','索引ID',NULL,'模式')
了解索引状态
填充因子:每个索引页的填满程度 如将填充因子设为 80% 20% 空余 将其余部分留作将来扩充之用,以便在向基础表中添加数据时为索引扩展提供空间
主要是减少叶级页拆分的可能 也就从而减少碎片的产生
如何设置填充因子的值并没有一个公式或者理念可以准确的设置。使用填充因子虽然可以减少更新或者插入时的分页,但同时因为需要更多的页,所以降低了查询的性能和占用更多的磁盘空间.如何设置这个值进行trade-off需要根据具体的情况来看.
具体情况要根据对于表的读写比例来看,我这里给出我认为比较合适的值:
1.当读写比例大于100:1时,不要设置填充因子,100%填充
2.当写的次数大于读的次数时,设置50%-70%填充
3.当读写比例位于两者之间时80%-90%填充