为什么聚集索引很容易引起死锁?请高手解答我的困惑。

楼主windljf(精神领袖)2004-12-08 08:49:23 在 MS-SQL Server / 基础类 提问

我的数据库很容易死锁,我后来发现是聚集索引引起的,我的索引填充因子是90,后来我把聚集索引去掉,问题就解决了,但是我不明白聚集索引为什么会引起死锁??请教高手 问题点数:100、回复次数:8Top

1 楼good2speed(Goodspeed)回复于 2004-12-08 09:18:24 得分 10

不知道你怎么知道死锁是由于聚集索引引起的?

下列方法有助于最大限度地降低死锁:

按同一顺序访问对象。

避免事务中的用户交互。

保持事务简短并在一个批处理中。

使用低隔离级别。

使用绑定连接。

Top

2 楼zjcxc(邹建)回复于 2004-12-08 09:18:43 得分 90

你的填充因子设置得不对

聚集索引代表了表中记录的存储顺序,所以每次数据的变化,都可能导致表中的数据按照聚集索引重新调整顺序

而填充因子设置为90,这是偏向于减少索引空间占用的做法,这样的做法导致为了减少索引的空间占用,使数据页的空闲空间很小

在向一个已满的索引页添加某个新行时,SQL   Server   把大约一半的行移到新页中以便为新行腾出空间。这种重组称为页拆分。页拆分会降低性能并使表中的数据存储产生碎片

因为你这样的填充因子设置,导致数据页空闲空间很小,所以页拆分经常发生,这样数据处理性能低,当然就很容易锁表了

删除聚集索引后,不存在调整数据顺序的问题,也就不产生页拆分的问题,因此就解决了死锁的问题.Top

3 楼zjcxc(邹建)回复于 2004-12-08 09:20:33 得分 0

正确的填充因子应该是偏小,保持默认的0或者10这样的较小值,这样产生的结果是索引占用的空间大,但因为数据页的空闲多,所以页拆分的机率小,也就在很大程度上避免了死锁

同时,在查询处理上,如果经常在聚集索引列上做条件查询,这样的效率是很高的Top

4 楼zjcxc(邹建)回复于 2004-12-08 09:21:07 得分 0

有关填充因子的一些说明,参考SQL联机帮助:

填充因子

在创建聚集索引时,表中的数据按照索引列中的值的顺序存储在数据库的数据页中。在表中插入新的数据行或更改索引列中的值时,Microsoft®   SQL   Server™   2000   可能必须重新组织表中的数据存储,以便为新行腾出空间,保持数据的有序存储。这同样适用于非聚集索引。添加或更改数据时,SQL   Server   可能不得不重新组织非聚集索引页中的数据存储。向一个已满的索引页添加某个新行时,SQL   Server   把大约一半的行移到新页中以便为新行腾出空间。这种重组称为页拆分。页拆分会降低性能并使表中的数据存储产生碎片。有关更多信息,请参见表和索引构架。

创建索引时,可以指定一个填充因子,以便在索引的每个叶级页上留出额外的间隙和保留一定百分比的空间,供将来表的数据存储容量进行扩充和减少页拆分的可能性。填充因子的值是从   0   到   100   的百分比数值,指定在创建索引后对数据页的填充比例。值为   100   时表示页将填满,所留出的存储空间量最小。只有当不会对数据进行更改时(例如,在只读表中)才会使用此设置。值越小则数据页上的空闲空间越大,这样可以减少在索引增长过程中对数据页进行拆分的需要,但需要更多的存储空间。当表中数据会发生更改时,这种设置更为适当。

提供填充因子选项是为了对性能进行微调。但是,使用   sp_configure   系统存储过程指定的服务器范围的默认填充因子,在大多数情况下都是最佳的选择。

说明     即使对于一个面向许多插入和更新操作的应用程序来说,数据库读取次数一般也超过数据库写入次数的   5   到   10   倍。因此,指定一个不同于默认设置的填充因子会降低数据库的读取性能,而降低量与填充因子设置值成反比。例如,当填充因子的值为   50%   时,数据库的读取性能会降低两倍。

只有当在表中根据现有数据创建新索引,并且可以精确预见将来会对这些数据进行哪些更改时,将填充因子选项设置为另一个值才有用。

填充因子只在创建索引时执行;索引创建后,当表中进行数据的添加、删除或更新时,不会保持填充因子。如果试图在数据页上保持额外的空间,则将有背于使用填充因子的本意,因为随着数据的输入,SQL   Server   必须在每个页上进行页拆分,以保持填充因子指定的空闲空间百分比。因此,如果表中的数据进行了较大的变动,添加了新数据,可以填充数据页的空闲空间。在这种情况下,可以重新创建索引,重新指定填充因子,以重新分布数据。

Top

5 楼zjcxc(邹建)回复于 2004-12-08 09:21:21 得分 0

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,该选项在停止并重新启动服务器后生效。

Top

6 楼zjcxc(邹建)回复于 2004-12-08 09:22:19 得分 0

一般的填充因子设置策略:

数据变化越频繁,填充因子越小

数据越少变化,填充因子越大,对于数据不变化的表,填充因子设置为100Top

7 楼windljf(精神领袖)回复于 2004-12-08 09:38:07 得分 0

谢谢你们的解答。Top

8 楼glassnake()回复于 2004-12-23 11:14:44 得分 0

fill   factor设置不当充其量只会导致性能下降,增加了死锁出现的机率.既然有死锁出现,我认为还是应当从   good2speed(Goodspeed)   所说的几方面考虑,才能把死锁的根源找出来.

mysql的填充因子_聚集索引和填充因子fill factor的设置,减少死锁 | 学步园相关推荐

  1. 聚集索引和填充因子fill factor的设置,减少死锁

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

  2. mysql聚集索引和非聚集索引的区别_聚集索引与非聚集索引的总结

    一.索引简介 众所周知,索引是关系型数据库中给数据库表中一列或多列的值排序后的存储结构,SQL的主流索引结构有B+树以及Hash结构,聚集索引以及非聚集索引用的是B+树索引.这篇文章会总结SQL Se ...

  3. mysql timestamp 默认_MySQL数据库TIMESTAMP怎么设置默认值 | 学步园

    MySQL数据库TIMESTAMP设置默认值新手技术人员对他感到很陌生,不知道该怎么设置.下面学步园小编来讲解下MySQL数据库TIMESTAMP怎么设置默认值? MySQL数据库TIMESTAMP怎 ...

  4. mysql主键创建非聚集索引_什么是聚集索引,非聚集索引,索引覆盖,回表,索引下推...

    聚集索引 我们先建如下的一张表 CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',`name` var ...

  5. mysql创建非聚集索引_聚集索引和非聚集索引的区别

    作者:riemann riemann.blog.csdn.net/article/details/90324846 一.深入浅出理解索引结构 实际上,可以把索引理解为一种特殊的目录.微软的SQL SE ...

  6. mysql聚合索引跟非聚合索引的区别_聚集索引和非聚集索引的区别有哪些

    下面说说索引使用的几个误区和问题 第一:聚集索引的约束是唯一性,是否要求字段也是唯一的呢? 分析:如果认为是的朋友,可能是受系统默认设置的影响,一般我们指定一个表的主键,如果这个表之前没有聚集索引,同 ...

  7. mysql manage keys_相传mysql 5.5 对于非聚集索引增删有很大的改善… 你信吗?

    相传mysql 5.5 版本对于非聚集索引添加.删除有很大的改善-- 5.1.61 在5.1 版本中,add/drop index(包括聚集和非聚集索引),都会先copy 一个 tmp table,如 ...

  8. Mysql (InnoDB引擎)聚集索引和辅助索引

    聚集索引: InnoDB存储引擎表是索引组织表,即按照主键的顺序存储数据.  聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,树中的叶子节点存放着表中的行记录数据,因此, ...

  9. java我的世界填充方块_我的世界填充指令 填充TNT的指令是什么

    我的世界填充指令 填充TNT的指令是什么.在我的世界里面有一些指令是具有填充效果的,那下面游戏园小编就给大家将我的世界填充指令介绍一下吧!还有TNT填充指令又是什么都会一一介绍的,那感兴趣的玩家不妨进 ...

  10. hive能加快MySQL查询速度吗_建立索引可以加快表中数据查询的速度吗

    首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合. 如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特 ...

最新文章

  1. 简易git操作 -- 让你的格子绿起来
  2. 大乐斗2服务器维护,2月23日更新公告
  3. 160个Crackme016
  4. jQuery入门[2]-选择器[转]
  5. 论文浅尝 - AAAI2021 | 从历史中学习:利用时间感知拷贝生成网络建模时态知识图谱...
  6. 【转载】一起聊天的wz132
  7. 用计算机模拟病毒,计算机模拟揭露HIV病毒体内传播细节,有望为治疗提供新途径...
  8. 苹果7支持快充吗_iPhone12的磁吸无线充到底怎么回事?是否支持苹果20W快充?
  9. [干货来袭]DevExpress ASP.NET示例资源最全分享!(二)
  10. PFSense 2.1 端口映射配置
  11. 淘宝天猫获取商品类目信息api接口数据获取
  12. 无需格式化,给C盘扩容(Windows11)
  13. 大学计算机考试不挂科秘诀,在大学,考试想不挂科,学渣的4个锦囊妙计,最后一点看笑了!...
  14. 读文献——《Deep Residual Learning for Image Recognition》
  15. 7系列FPGA数据手册:概述------中文翻译版
  16. 记录Mybatis报Mapped Statements collection already contains value for 的错误的原因
  17. uni-app。APP-PLUS 获取应用缓存,缓存清除
  18. PHP实现生成推广海报的方法详解
  19. VMware该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权
  20. mysql索引升序降序失效原因_关于联合索引的升序降序和order by关系以及失效问题...

热门文章

  1. win2012部署asp网站相关
  2. Set集合:求交集、并集和差集
  3. dlang,不必要串插件的类型提升.
  4. 转载一篇c语言深度文章 《一个“蝇量级” C 语言协程库》
  5. 小布助手对话短文本语义匹配
  6. 【上海市】青年大学习自动提醒 代码脚本
  7. Justinmind使用教程(2)——计算表达式及条件用法
  8. Android自定义导览地图组件(二)
  9. windows系统桌面壁纸软件推荐名称
  10. 计算机写给未来自己的一段话,写给未来的自己一句话致未来自己的句子简短励志...