当前位置:编程学习 > C#/ASP.NET >>

大量数据又死锁了该如何处理

    大家好,先说说我之前的一个经历,前个月网站突然卡死报数据库连接超时错误,甚至从界面上无法登录数据库,还必须以dos命令 net stop mssqlserver, 然后net start mssqlserver来重启数据库,好那么一下又卡死了,我用的是2005,数据库主要数据文件达到1.39G, 服务器2003。当卡的时候,我用 exec sp_who_lock 命令无查看死锁和堵塞,一运行一大堆的死锁和堵塞,看到都吓人,最后弄清楚了,是因为我的创建索引过多,在数据插入修改的时候效率极低,导致的,结果我适当删除了一些索引就没事啦,由此可见当报死锁的时候,并不一定是提示死锁的存储过程的问题,而且其他问题导致的死锁堵塞的大排队。
    可过了一个多月,现在又出现了死锁,我又适当删除了一些索引,并且把每个表都重建索引了(  DBCC DBREINDEX(数据库名..表名,'',0)每个表都以这样的方式重建索引    ),死锁依然时而出现,这个时候我就不知道该怎么办了,因为我的数据库有几个表都几十万数据,有一个表一百多万,都是插入和查询比较平凡的表,为不会是因为数据量大导致的死锁呢?
几十万的数据会至于导致死锁吗?
    如果是因为数据量大的原因,那么有什么好办法吗?我考虑过分表,比如把去年一年的数据存在到另一张结构相同的表, 但是这样的改动,在查询的时候很不方便。 有没有什么更好的办法吗? 
    我的表主键都是guid类型,默认主键聚集索引,我改成非聚集的,因为让物理存储顺序按guid列排序,应该是效率很低的,所以我的表基本上没有聚集索引,但我会根据查询的排序字段适当创建非聚集索引, 会不会是这个原因呢? --------------------编程问答-------------------- 定期清理备份一些数据 --------------------编程问答-------------------- 数据不能删除的 --------------------编程问答-------------------- 表示不知道怎么回事,期待问题解决方案 --------------------编程问答-------------------- 帮顶 学习 接分 --------------------编程问答-------------------- 这个问题值得关注,帮顶一下 --------------------编程问答-------------------- 关注下 帮顶 --------------------编程问答-------------------- 不重要的查询使用脏读

select .... from yourtable (nolock) --------------------编程问答--------------------
引用 1 楼 wxr0323 的回复:
定期清理备份一些数据

学习哈. --------------------编程问答-------------------- 更新使用了更新锁?
哪些存储过程使用了锁?
列出来看看。 --------------------编程问答--------------------  路过,  顶顶 --------------------编程问答-------------------- 值得关注! --------------------编程问答--------------------   一: SQL查询优化一下,查询时where 后的语句要和索引里的顺序对应,你在用索引想必应该是优化过这方面的。
  二:还有定期重新生成索引,索引在使用一段时间后会有碎片。
  三:建立表分区。
  四:用SQL的性能分析功具找出哪些查询或是写入比较查资源,然后再找解决办法。



一般来说一个表超过30万条数据就要小心了。 --------------------编程问答-------------------- 可以把表用年份或月份来创建数据,程序要注意此方式读取,类似分区概念,当然sql2008是有分区功能的 --------------------编程问答-------------------- 才不到2G的数据库就要“分表”?你是靠删除大量索引来“解决”死锁问题?什么是死锁(难道报告异常“数据库连接超时错误”就叫做死锁)?

无语。我们每个月做少增加30G数据的时候,也没有为数据库分表呢。堆砌一大堆名词,我看不出你的问题。不过只是给你一个建议,好好看看应用程序连接和使用数据库方面有没有程序bug、流程设计问题,不要盯着数据库表。 --------------------编程问答-------------------- 做少  -->  最少 --------------------编程问答--------------------
引用 14 楼 sp1234 的回复:
才不到2G的数据库就要“分表”?你是靠删除大量索引来“解决”死锁问题?什么是死锁(难道报告异常“数据库连接超时错误”就叫做死锁)?

无语。我们每个月做少增加30G数据的时候,也没有为数据库分表呢。堆砌一大堆名词,我看不出你的问题。不过只是给你一个建议,好好看看应用程序连接和使用数据库方面有没有程序bug、流程设计问题,不要盯着数据库表。

看sp大哥的言论,总能学到很多。。 --------------------编程问答-------------------- 不用聚集索引,效率太低了吧?特别是分页的时候。
另外建议采用中间层缓存查询结果,不要频繁的访问数据库,同时使用一个好的ORM框架。 --------------------编程问答-------------------- 用聚集索引,插入删除效率会很低吧?
--------------------编程问答-------------------- 用表分区 --------------------编程问答--------------------   我以前的那家公司我记得一个测试数据库就18G呢,很少出现死机的现象。 --------------------编程问答-------------------- 用脏读 select  with (nolock)
这个肯定是由于在程序上设计的问题,减少表的关联性,缩小表的字段数量,分离不需要经常访问的字段到其他表.尽量少用表关联. --------------------编程问答--------------------
引用 14 楼 sp1234 的回复:
才不到2G的数据库就要“分表”?你是靠删除大量索引来“解决”死锁问题?什么是死锁(难道报告异常“数据库连接超时错误”就叫做死锁)?

无语。我们每个月做少增加30G数据的时候,也没有为数据库分表呢。堆砌一大堆名词,我看不出你的问题。不过只是给你一个建议,好好看看应用程序连接和使用数据库方面有没有程序bug、流程设计问题,不要盯着数据库表。

学习了 --------------------编程问答--------------------   超时不是索引的问题。你只要建个作业定期清理索引碎片。。 应该跟你写的查询语句, 和你的数据操作层应该有问题。。。去优化下。。  查询尽量用contains查询吧。。。    另外可以使用点缓存。。 --------------------编程问答-------------------- with nolock 会改善很多。 --------------------编程问答-------------------- 可以偿试用分区表
SQL Server分区表
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,