gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:19:58 24 4
gpt4 key购买 nike

我一直在网上搜索书籍和谷歌咒语,试图找出叶页(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的数据页由以下元素组成:
  • Page header :96字节,固定。
  • Data :变量
  • Row offset array : 多变的。

  • 行偏移数组总是存储在页面的末尾并向后增长。

    数组的每个元素都是 2 -byte 值,保存到页面内每一行开头的偏移量。

    行在数据页内没有排序:相反,它们的顺序(在集群存储的情况下)由行偏移数组决定。这是排序的行偏移量。

    比如说,如果我们插入一个 100 -byte 行,簇键值为 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]

    该行是 前置 逻辑上但 附加 body 上。

    偏移数组被重新排序以反射(reflect)行的逻辑顺序。

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

    关于sql-server - 填充因子是如何物理分配的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1367570/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com