Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 填充系数是如何分配的?_Sql Server_Sql Server 2005_Sql Server 2000_Fillfactor - Fatal编程技术网

Sql server 填充系数是如何分配的?

Sql server 填充系数是如何分配的?,sql-server,sql-server-2005,sql-server-2000,fillfactor,Sql Server,Sql Server 2005,Sql Server 2000,Fillfactor,我一直在网上搜寻书籍和谷歌咒语,试图找出叶子页面中的填充因子(SQLServer2000和2005) 我知道当创建索引时,页面上剩余的空闲空间是多少,但我没有发现的是该空间实际上是如何留下的:即,是页面末尾的一大块空间,还是该数据之间的几个间隙 例如,[为了简单起见],假设一个页面只能容纳100行。如果填充系数规定为75%,这是否意味着页面的第一个(或最后一个)75%是数据,其余部分是自由的,或者每四行是自由的(即页面看起来像:数据、数据、数据、自由、数据、数据、自由……) 长短不一的是,我得到

我一直在网上搜寻书籍和谷歌咒语,试图找出叶子页面中的填充因子(SQLServer2000和2005)

我知道当创建索引时,页面上剩余的空闲空间是多少,但我没有发现的是该空间实际上是如何留下的:即,是页面末尾的一大块空间,还是该数据之间的几个间隙

例如,[为了简单起见],假设一个页面只能容纳100行。如果填充系数规定为75%,这是否意味着页面的第一个(或最后一个)75%是数据,其余部分是自由的,或者每四行是自由的(即页面看起来像:数据、数据、数据、自由、数据、数据、自由……)

长短不一的是,我得到了一个关于物理操作的确切控制,当使用聚集索引将行插入到表中时,会发生什么,而插入不会发生在行的末尾。如果一个页面上留有多个间隙,则插入的影响最小(至少在页面拆分之前),因为可能需要移动以容纳插入的行数最小化。如果间隙在表中的一大块中,那么(至少在理论上)处理周围行的开销将显著增加


如果有人知道MSDN参考,请告诉我!我现在找不到(尽管还在找)。从我所读到的内容来看,这意味着有很多差距,但这似乎没有明确说明。

这是我第一次想到这一点,我对结论并不乐观,但是

由于SQL Server在单个读取IO中可以检索的最小数据量是一整页数据,那么为什么首先需要对单个页面中的任何行进行排序?我敢打赌,它们不是,因此,即使最后的差距都在一个大差距中,不管排序顺序是否正确,也可以在最后添加新记录。(如果首先没有理由对页面上的记录进行排序)

其次,考虑到IO的写端,我认为最小的写块也是整个页面(即使是最小的更改也需要将整个页面写回磁盘)。这意味着每次写入页面时,页面上的所有行都可以在内存中进行排序,因此,即使您插入到丁格尔页面上已排序行集合的开头,整个页面都会被读取,新记录也可以插入到内存集合中的适当插槽中,然后整个新排序的页面被写回磁盘

来自:

填充因子设置仅在创建或重建索引时适用。
SQL Server数据库引擎
不会在页面中动态保留指定百分比的空白空间。试图保持数据页上的额外空间将无法达到填充因子的目的,因为
数据库引擎
必须执行页面拆分,以保持输入数据时填充因子在每页上指定的可用空间百分比

此外:

将新行添加到完整索引页时,
数据库引擎
将大约一半的行移动到新页,为新行腾出空间。这种重组称为页面拆分。页面拆分为新记录腾出空间,但执行此操作可能需要时间,而且是一项资源密集型操作。此外,它还可能导致碎片,从而导致增加的
I/O
操作。当频繁发生页面拆分时,可以通过使用新的或现有的填充因子值重新分布数据来重建索引

SQL Server的数据页由以下元素组成:

  • 页眉
    96
    字节,已修复
  • 数据
    :变量
  • 行偏移数组
    :变量
行偏移量数组始终存储在页面末尾,并向后增长

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

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

比方说,如果我们将一个群集键值为
10
100
字节行插入到一个群集表中,它进入一个空闲页,它将按如下方式插入:

[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]
该行在逻辑上是前置的,但在物理上是追加的

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


有鉴于此,我们可以很容易地看到,行从页面的开始被追加到可用空间,而指向行的指针则从页面的结束被前置到可用空间。

是的,我看到了,但这并没有说明填充因子最初是如何分布的。@Quassnoi,我想他是在问当一个新行被“插入”到页面上的空白处时会发生什么。无论空白是散布在整个页面上,还是全部在物理页面的末尾,(他认为)都会影响插入的性能…@Charles--“thinks”有点强:-)我在读一些相互冲突的博客,有些人说会,有些人说不会。我只是想更深入地了解发生了什么…@rangerchris,你说得对,对不起,用词不当!。也许“他提问”会更好……我不得不猜测,额外的空间都在后面。例如,如果一行包含两个varchar(100)列,如何在整个页面中“分散”空白?我喜欢Charles Bretana的猜测(每次磁盘写入都会完成工作)。希望有人谁知道将添加