Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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约束中的PAD_索引的用途是什么?_Sql_Sql Server_Indexing - Fatal编程技术网

此SQL Server约束中的PAD_索引的用途是什么?

此SQL Server约束中的PAD_索引的用途是什么?,sql,sql-server,indexing,Sql,Sql Server,Indexing,我对我的一个表应用了以下约束,但我不知道PAD_索引是什么意思 有人能启发我吗 CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED ( [EmployeeId] ASC ) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] ^--------------^ this part here 发件人: PAD_索引={ON|OFF} 指定索引填充

我对我的一个表应用了以下约束,但我不知道PAD_索引是什么意思

有人能启发我吗

CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED 
(
    [EmployeeId] ASC
) WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
        ^--------------^
         this part here
发件人:

PAD_索引={ON|OFF}

指定索引填充。默认设置为关闭

关于: fillfactor指定的可用空间百分比应用于索引的中间级别页面

未指定关闭或填充因子: 考虑到中间页上的键集,中间级页被填充到接近容量,为索引可以具有的最大大小的至少一行留出足够的空间

PAD_INDEX选项仅在指定FILLFACTOR时有用,因为PAD_INDEX使用FILLFACTOR指定的百分比。如果为FILLFACTOR指定的百分比不够大,无法容纳一行,则数据库引擎会在内部重写该百分比以容纳最小值。无论fillfactor的值有多低,中间索引页上的行数永远不少于两行


在向后兼容的语法中,WITH PAD_INDEX等同于WITH PAD_INDEX=ON。

SQL Server中的索引是

  • 填充因子适用于底层
    这是下图中的叶节点/数据层

  • PAD_INDEX ON表示“将填充因子应用于所有层”
    这是下图中的中间级别(根和数据之间)

这意味着PAD_索引只有在设置了FILLFACTOR时才有用。FILLFACTOR确定数据页中的可用空间(大致)

:


基本上,如果您希望定期对索引进行大量随机更改,可以将PAD_INDEX=设置为打开

这有助于避免索引页拆分


当我期望索引中包含的30%以上的随机记录定期被删除时,我将其设置为打开

这实际上是一个非常复杂的问题打开PAD_索引会对大型表中的读取性能和内存压力产生显著影响。桌子越大,效果越大。作为一个规则,我会说你想放弃它,除非你属于一些不寻常的类别。然后,仔细遵循此建议。正如我在下面的示例中所展示的,当PAD_INDEX打开时调整FILLFACTOR可能会产生指数效应,需要仔细平衡

  • PAD_索引总是对读取有不利影响!FILLFACTOR越低,效果就越大,因此启用它时需要密切注意FILLFACTOR的值。在大型表格中,您基本上停止考虑减少叶分裂的填充因子,并开始考虑其对中间膨胀与中间分裂的影响
  • PAD_索引很少对行数少于100000行的索引产生有用的影响,也不会对包含标识或插入时间类型列的索引产生积极影响,因为插入总是在表的末尾
  • 从上面你应该看到,如果你打开PAD_索引,你必须小心地平衡消极影响和积极影响
  • 经验法则:PAD_索引在以下情况下很少有用:

  • 非聚集索引-除非它们很宽
  • 关于非常窄表的聚集索引
  • 在少于100K行的表上-除非插入是高度聚集的,即使这样也可能有问题
  • 您必须了解它的工作原理: 在索引中插入行时,该行必须适合包含适当键范围的叶块。聚集索引通常比非聚集索引具有更宽的行,因此它们的叶块包含更少的行。FillFactor为叶中的新行创建空间,但如果非常宽的行或大量插入物聚集在一起而不是均匀分布,则通常无法或不可能创建足够的松弛(1-pct填充)来防止拆分

    发生拆分时,将创建一个新的中间行以指向新块,并且该行必须适合其相应的块。如果中间块已满,则必须首先将其拆分。如果你特别不走运,分裂可能会一直延伸到根部。当根分裂时,您将创建一个新的索引级别

    PAD_索引的目的是在中间层块中强制使用最小的可用空间。

    重建后,较低标高可能几乎没有空间。因此,如果你有大量的叶子分裂,并且PAD_索引没有打开,那么你可以在所有地方对中间产物进行大规模分裂

    不过,大多数情况下,可以使用FILLFACTOR管理拆分。更大的拆分问题发生在插入模式上,插入模式实际上保证了您没有足够的可用空间,打开PAD_INDEX有助于缓解这一问题,因为它提供了更深层次的空间,所以当拆分发生时,您不太可能发生大量多级拆分

    示例案例

    我有一张10万行的客户表。在任何一天,我的客户中大约有5%是活跃的。我有一个按时间按客户记录活动的表。平均而言,一个客户执行20个操作,描述平均花费1K。所以我收集了100MB的数据,假设我已经有一年的时间了——大约36GB

    表中插入了1Kb的行,其中包含关键列的customer\u number和insert\u time(按该顺序)。很明显,普通客户在插入期望的20行时会分割一个8K的叶块,因为每个行将在同一个块中的前一行之后立即插入,直到它分裂、分裂和分裂(使一个只考虑非聚集索引的堆)。如果指向相应叶的中间块没有足够的空间容纳至少4行(实际上可能是8行,但…),中间块将
    CREATE CLUSTERED INDEX [IX_z_arch_export_dzienny_pre] ON [dbo].[z_arch_export_daily_pre]
    (
        [Date] ASC,
        [Object Code] ASC,
        [From date] ASC,
        [Person_role] ASC,
        [Departure] ASC,
        [Room code] ASC,
        [period_7_14] ASC
    )WITH (PAD_INDEX = ON, FILLFACTOR=100)
    
    
    insert into z_arch_export_daily_pre
    select * from export_daily_pre
    order by [Date] ASC,[Object Code] ASC,[From date] ASC,[Person_role] ASC,[Departure] ASC,[Room code] ASC,[period_7_14] ASC