紧急救命!问什么索引会搞到死锁,严重超时!

HarryZhang 2005-01-20 09:31:21
紧急救命!问什么索引会搞到死锁,严重超时!

我现在在一个每天都会储存5G数据的表里设置了主键,

可是现在数据量超过50万条、容量超过50G的表里插入数据很慢,

甚至会死锁,死锁上面写的是索引死锁,如果删除索引可能会没问题,

但是查询又会很慢,索引是建立在不需要更改的字段上,请问这是为什么?

另外在一个日志表里也出现这样的问题,但那个日志标只有11万条记录,

只要建立索引,操作一两天就会产生死锁,请高手们帮忙解答,谢谢!!
...全文
328 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
seven 2005-05-12
  • 打赏
  • 举报
回复
mark
rouqu 2005-01-20
  • 打赏
  • 举报
回复
1.Turn Off HyperThreading
2.MAXDOP = 1
3.Checktable('tablename')
4.sp_lock
zjcxc 2005-01-20
  • 打赏
  • 举报
回复
索引只是引起死锁的原因之一,还有其他很多情况也会引起死锁,所以你还要检查其他处理语句
HarryZhang 2005-01-20
  • 打赏
  • 举报
回复
另外我还有一个表只是用了一个普通的索引,都会一两天之后产生死锁,不知道为什么,只有11万条数据,就会死掉,很奇怪,我的是双p4 2.8 xeon 2G ram 磁盘阵列1.5T
HarryZhang 2005-01-20
  • 打赏
  • 举报
回复
但是我之前都取消了聚集索引,只是用普通索引
zjcxc 2005-01-20
  • 打赏
  • 举报
回复
所以我上面建议你取消聚集索引,设置填充因子为0

另外,删除聚集索引会导致其他索引重建,重建索引需要对表中的数据重建立索引结果,所以重建索引慢是正常的
zjcxc 2005-01-20
  • 打赏
  • 举报
回复
表结构不太重要.

创建主键,默认情况下会加上聚集索引,聚集索引会在数据变化时,调整记录的存放位置,如果你的主键设置在顺序容易受数据变化的字段上,那势必在数据变化时,导致sql经常移动记录的位置来适应这种变化,引起大量的i/o操作,严重影响效率,最终导致死锁

而填充因子是另一个影响数据处理效率的因素,填充因子决定每个索引页的保留空间大小,如果这个值设置得很大,则保留空间很小,数据变化引起索引变化时,如果没有保留空间,则sql要重新调整索引页,对索引页进行拆分,如果保留空间太小,则这种处理是经常的,也严重影响处理效率

所以我上面建议你取消聚集索引,设置填充因子为
HarryZhang 2005-01-20
  • 打赏
  • 举报
回复
我给你看看表的结构
create table page_table(pageid int,archno varchar(30), pageno int, pageimage image,opdate char(10),optime char(8))
然后在pageid字段建立主建,archno和pageno建立唯一索引,但是当数据量去到50万,容量去到50G就死了,然后要更改索引,但是也是很慢
lys1706228 2005-01-20
  • 打赏
  • 举报
回复
学习
rouqu 2005-01-20
  • 打赏
  • 举报
回复
填充因子 (BOL)
========
在创建聚集索引时,表中的数据按照索引列中的值的顺序存储在数据库的数据页中。在表中插入新的数据行或更改索引列中的值时,Microsoft® SQL Server™ 2000 可能必须重新组织表中的数据存储,以便为新行腾出空间,保持数据的有序存储。这同样适用于非聚集索引。添加或更改数据时,SQL Server 可能不得不重新组织非聚集索引页中的数据存储。向一个已满的索引页添加某个新行时,SQL Server 把大约一半的行移到新页中以便为新行腾出空间。这种重组称为页拆分。页拆分会降低性能并使表中的数据存储产生碎片

将该值设置为0将保证最大的Performance.

更新操作频繁的表不考虑cluster index.
zjcxc 2005-01-20
  • 打赏
  • 举报
回复
将聚集索引改为非聚集索引,将索引的填充因子设置为0
子陌红尘 2005-01-20
  • 打赏
  • 举报
回复
是怎样定义主键的?
pbsql 2005-01-20
  • 打赏
  • 举报
回复
不要在顺序经常变动的字段上建聚集索引

估计是有聚集索引,你把聚集索引去掉看看
WangZWang 2005-01-20
  • 打赏
  • 举报
回复
建立索引会使查询速度加快,同时影响了更新的速度.
所以要合理的建立索引,使在查询和更新两者间考虑
平衡.
由你上面分析,可能是由于建立了不适合的索引,每次
更新都要进行大量的移动,使得处理进入堵塞导致死锁.
要解决问题要从分析数据库的设计及程序调用上来
分析,我们只能给点意见.

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧