sql-server – 如何物理分配填充因子?

我一直在网上搜索书籍和谷歌咒语试图找出一个叶子页面中的填充因子(SQL Server 2000和2005).

我知道创建索引时页面上剩余空间的数量是多少,但我没有找到实际留下的空间:即,它是一个朝向页面末尾的大块,或者是它通过这些数据存在一些差距.

例如,[只是为了保持简单],假设一个页面只能容纳100行.如果填充因子被声明为75%,这是否意味着页面的第一个(或最后一个)75%是数据而其余部分是空闲的,或者是每第四行都是空闲的(即页面看起来像:数据,数据,数据,免费,数据,数据,数据,免费,…).

这个问题的长短之处在于,我正在准确地处理在将行插入具有聚簇索引的表中时发生的物理操作所发生的事情,并且插入不会发生在行的末尾.如果在页面中留下多个间隙,则插入对影响最小(至少在页面拆分之前),因为可能需要移动以容纳插入的行数最小化.如果差距在表中的一个大块中,那么处理周围行的开销(理论上至少)会明显更多.

如果有人知道MSDN参考,请指点我!我现在找不到一个(尽管仍在寻找).从我所读到的内容来看,这意味着存在许多差距 – 但这似乎并没有明确说明.

最佳答案 从
MSDN开始:

The fill-factor setting applies only when the index is created, or rebuilt. The SQL Server Database Engine does not dynamically keep the specified percentage of empty space in the pages. Trying to maintain the extra space on the data pages would defeat the purpose of fill factor because the Database Engine would have to perform page splits to maintain the percentage of free space specified by the fill factor on each page as data is entered.

并进一步:

When a new row is added to a full index page, the Database Engine moves approximately half the rows to a new page to make room for the new row. This reorganization is known as a page split. A page split makes room for new records, but can take time to perform and is a resource intensive operation. Also, it can cause fragmentation that causes increased I/O operations. When frequent page splits occur, the index can be rebuilt by using a new or existing fill factor value to redistribute the data.

SQL Server的数据页面包含以下元素:

>页眉:96字节,已修复.
>数据:变量
>行偏移数组:变量.

行偏移数组始终存储在页面的末尾并向后增长.

数组的每个元素都是2字节值,将偏移量保存到页面中每行的开头.

行不在数据页中排序:相反,它们的顺序(在集群存储的情况下)由行偏移数组确定.这是排序的行偏移量.

比如说,如果我们将一个100字节的行(簇密钥值为10)插入到一个聚簇表中并进入一个空闲页面,它将被插入如下:

[00   - 95   ]   Header
[96   - 195  ]   Row 10
[196  - 8190 ]   Free space
[8190 - 8191 ]   Row offset array: [96]

然后我们在同一页面中插入一个新行,这次集群键值为9:

[00   - 95   ]   Header
[96   - 195  ]   Row 10
[196  - 295  ]   Row 9
[296  - 8188 ]   Free space
[8188 - 8191 ]   Row offset array: [196] [96]

该行在逻辑上预先添加,但在物理上附加.

偏移数组被重新排序以反映行的逻辑顺序.

鉴于此,我们可以很容易地看到行从页面的开头附加到空闲空间,而指向行的指针从页面末尾开始预先添加到空闲空间.

点赞