聚集索引和填充因子fill factor的设置,减少死锁(转载)

我的数据库很容易死锁,我后来发现是聚集索引引起的,我的索引填充因子是90,后来我把聚集索引去掉,问题就解决了,但是我不明白聚集索引为什么会引起死锁??

你的填充因子设置得不对         聚集索引代表了表中记录的存储顺序,所以每次数据的变化,都可能导致表中的数据按照聚集索引重新调整顺序         而填充因子设置为90,这是偏向于减少索引空间占用的做法,这样的做法导致为了减少索引的空间占用,使数据页的空闲空间很小     在向一个已满的索引页添加某个新行时,SQL   Server   把大约一半的行移到新页中以便为新行腾出空间。这种重组称为页拆分。页拆分会降低性能并使表中的数据存储产生碎片     因为你这样的填充因子设置,导致数据页空闲空间很小,所以页拆分经常发生,这样数据处理性能低,当然就很容易锁表了  ;

有关填充因子的一些说明,参考SQL联机帮助:            填充因子     在创建聚集索引时,表中的数据按照索引列中的值的顺序存储在数据库的数据页中。在表中插入新的数据行或更改索引列中的值 时,可能必须重新组织表中的数据存储,以便为新行腾出空间,保持数据的有序存储。这同样适用于非聚集索引。添加或更改数据时,SQL   Server   可能不得不重新组织非聚集索引页中的数据存储。向一个已满的索引页添加某个新行时,SQL   Server   把大约一半的行移到新页中以便为新行腾出空间。这种重组称为页拆分。页拆分会降低性能并使表中的数据存储产生碎片。有关更多信息,请参见表和索引构架。         创建索引时,可以指定一个填充因子,以便在索引的每个叶级页上留出额外的间隙和保留一定百分比的空间,供将来表的数据存储容量进行扩充和减少页拆分的可能 性。填充因子的值是从   0   到   100   的百分比数值,指定在创建索引后对数据页的填充比例。值为   100   时表示页将填满,所留出的存储空间量最小。只有当不会对数据进行更改时(例如,在只读表中)才会使用此设置。值越小则数据页上的空闲空间越大,这样可以减 少在索引增长过程中对数据页进行拆分的需要,但需要更多的存储空间。当表中数据会发生更改时,这种设置更为适当。         提供填充因子选项是为了对性能进行微调。但是,使用   sp_configure   系统存储过程指定的服务器范围的默认填充因子,在大多数情况下都是最佳的选择。                  说明     即使对于一个面向许多插入和更新操作的应用程序来说,数据库读取次数一般也超过数据库写入次数的   5   到   10   倍。因此,指定一个不同于默认设置的填充因子会降低数据库的读取性能,而降低量与填充因子设置值成反比。例如,当填充因子的值为   50%   时,数据库的读取性能会降低两倍。             只有当在表中根据现有数据创建新索引,并且可以精确预见将来会对这些数据进行哪些更改时,将填充因子选项设置为另一个值才有用。         填充因子只在创建索引时执行;索引创建后,当表中进行数据的添加、删除或更新时,不会保持填充因子。如果试图在数据页上保持额外的空间,则将有背于使用填 充因子的本意,因为随着数据的输入,SQL   Server   必须在每个页上进行页拆分,以保持填充因子指定的空闲空间百分比。因此,如果表中的数据进行了较大的变动,添加了新数据,可以填充数据页的空闲空间。在这 种情况下,可以重新创建索引,重新指定填充因子,以重新分布数据。

  fill   factor   选项     使用   fill   factor   选项指定当使用现有数据创建新索引时,Microsoft®   SQL   Server™   应使每一页填满的程度。由于   SQL   Server   必须在填充时花费时间分割这些页面,所以   fill   factor   百分比会影响系统性能。         fill   factor   百分比仅在创建索引时使用。这些页面都不可能被维护在任何特定的饱满水平上。         fill   factor   的默认值为   0;其有效值是从   0   到   100。fill   factor   的值为   0   并不表示页面的填满程度为   0%。类似于   fill   factor   设置为   100   的情况,SQL   Server   在   fill   factor   值为   0   时,会用页面全部为数据的页来创建聚集索引,用页面全部为数据的叶子页来创建非聚集索引。与   fill   factor   设置为   100   的情况不同的是,SQL   Server   在索引树的高层级别上预留空间。很少有理由去改变   fill   factor   的默认值,因为可以使用   CREATE   INDEX   命令来覆盖它。         较小的   fill   factor   值将导致   SQL   Server   以不饱满的页面创建新索引。例如,将   fill   factor   值设置为10   对于想在一个最终将保持较少数据的表上创建索引是合适的。越小的   fill   factor   值将导致每一个索引占用更多的存储空间,但同时也允许以后可不进行页面拆分进行插入操作。         如果设置   fill   factor   值为   100,SQL   Server   以100%   的饱满度创建聚集和非聚集索引。设置   fill    factor   的值为   100   仅对只读表是合适的,因为数据从来不被添加到此类表中。         fill    factor   是一个高级选项。如果要用   sp_configure   系统存储过程改变该设置,必须把当   show    advanced   options   设置为   1   时仅能更改   fill   factor,该选项在停止并重新启动服务器后生效。

  一般的填充因子设置策略:     数据变化越频繁,填充因子越小     数据越少变化,填充因子越大,对于数据不变化的表,填充因子设置为100

聚集索引和填充因子fill factor的设置,减少死锁(转载)

时间: 2024-10-27 10:01:56

聚集索引和填充因子fill factor的设置,减少死锁(转载)的相关文章

sql索引的填充因子多少最好,填充因子的作用?

当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量.填充因子设置为100意味着每个索引页100%填满,50%意味着每个索引页50%填满. 如果你创建一个填充因子为100的聚集索引(在一个非单调递增的列上),那意味着每当一个记录被插入(或修改)时,页拆分都会发生,因为在现存的页上没有这些数据的空间.很多的页拆分会降低sqlserver的性能. 举个例子:假定你刚刚用缺省的填充因子新创建了一个索引.当sqlserver创建它时,它把索引放在相

sql索引的填充因子多少最好,填充因子有什么用

    和索引重建最相关的是填充因子.当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量.填充因子设置为100意味着每个索引页100%填满,50%意味着每个索引页50%填满.如果你创建一个填充因子为100的聚集索引(在一个非单调递增的列上),那意味着每当一个记录被插入(或修改)时,页拆分都会发生,因为在现存的页上没有这些数据的空间.很多的页拆分会降低sqlserver的性能.举个例子:假定你刚刚用缺省的填充因子新创建了一个索引.当sqls

数据库索引的填充因子

举个例子:假定你刚刚用缺省的填充因子新创建了一个索引.当sqlserver创建它时,它把索引放在相邻的物理页面上,因为数据能够顺序的读所以这样会有最优的i/o访问.但当表随着..增加和改变时,发生了页拆分.当页拆分发生时,sqlserver必须在磁盘的某处分配一个新的页,这些新的页和最初的物理页不是连续的.因此,访问使用的是随机的i/o,而不是有顺序的i/o,这样访问索引页会变得更慢.      那么理想的填充因子是多少呢?它依赖于应用程序对sqlserver表的读和写的比率.首要的原则,按照下

主键与聚集索引的区别

有些人可能对主键和聚集索引有所混淆,其实这两个是不同的概念,下面是一个简单的描述.不想看绕口文字者,直接看两者的对比表.尤其是最后一项的比较. 主键(PRIMARY KEY ) 来自MSDN的描述: 表通常具有包含唯一标识表中每一行的值的一列或一组列.这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性.在创建或修改表时,您可以通过定义 PRIMARY KEY 约束来创建主键. 一个表只能有一个 PRIMARY KEY 约束,并且 PRIMARY KEY 约束中的列不能接受空值.由于

T-SQL查询高级—SQL Server索引中的碎片和填充因子

写在前面:本篇文章需要你对索引和SQL中数据的存储方式有一定了解.标题中高级两个字仅仅是因为本篇文章需要我的T-SQL进阶系列文章的一些内容作为基础. 简介 在SQL Server中,存储数据的最小单位是页,每一页所能容纳的数据为8060字节.而页的组织方式是通过B树结构(表上没有聚集索引则为堆结构,不在本文讨论之列)如下图: 在聚集索引B树中,只有叶子节点实际存储数据,而其他根节点和中间节点仅仅用于存放查找叶子节点的数据. 每一个叶子节点为一页,每页是不可分割的. 而SQL Server向每个

填充因子

如何设置填充因子的值 如何设置填充因子的值并没有一个公式或者理念可以准确的设置.使用填充因子虽然可以减少更新或者插入时的分页,但同时因为需要更多的页,所以降低了查询的性能和占用更多的磁盘空间.如何设置这个值进行trade-off需要根据具体的情况来看. 具体情况要根据对于表的读写比例来看,我这里给出我认为比较合适的值: 1.当读写比例大于100:1时,不要设置填充因子,100%填充 2.当写的次数大于读的次数时,设置50%-70%填充 3.当读写比例位于两者之间时80%-90%填充 上面的数据仅

SQL Server索引的维护 - 索引碎片、填充因子 <第三篇>

实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题都和页密度有关,虽然两者的表现形式在本质上有所区别,但是故障排除工具是一样的,因为处理是相同的. 对于非常小的表(比64KB小得多),一个区中的页面可能属于多余一个的索引或表---这被称为混合区.如果数据库中有太多的小表,混合区帮助SQL Server节约磁盘空间. 随着表(或索引)增长并且请求超过8个页面,SQL Server创建专用于该表(或索引)的区并且从该区中分配页面.这样一个区被称为统一区,它可以为多达8个相同表或索引的

转: SQL Server索引的维护 - 索引碎片、填充因子

转:http://www.cnblogs.com/kissdodog/archive/2013/06/14/3135412.html 实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题都和页密度有关,虽然两者的表现形式在本质上有所区别,但是故障排除工具是一样的,因为处理是相同的. 对于非常小的表(比64KB小得多),一个区中的页面可能属于多余一个的索引或表---这被称为混合区.如果数据库中有太多的小表,混合区帮助SQL Server节约磁盘空间. 随着表(或索引)增长并且请求超过

MySQL的btree索引和hash索引&聚集索引

1,BTREE是多叉树,多路径搜索树.有N棵子树的节点它包含N-1个关键字,例如,有3个子树的非叶子节点,那么就有2个关键字,每个关键字不保存数据,只用来存储索引(在索引存储数据时,将索引指向关键字的值也存储进来.最终实现key = &get; value结构).所有的数据最终都要落在叶子节点,所有的叶子节点包括关键字信息以及指向这些关键字的指针,而且叶子节点是根据关键字大小.顺序链接的.所有的叶子节点都必须有个链表指针把数据串起来.所以,所有非叶子节点可以看成索引部分,包括子树中最大值或最小值