大家好,先说说我之前的一个经历,前个月网站突然卡死报数据库连接超时错误,甚至从界面上无法登录数据库,还必须以dos命令 net stop mssqlserver, 然后net start mssqlserver来重启数据库,好那么一下又卡死了,我用的是2005,数据库主要数据文件达到1.39G, 服务器2003。当卡的时候,我用 exec sp_who_lock 命令无查看死锁和堵塞,一运行一大堆的死锁和堵塞,看到都吓人,最后弄清楚了,是因为我的创建索引过多,在数据插入修改的时候效率极低,导致的,结果我适当删除了一些索引就没事啦,由此可见当报死锁的时候,并不一定是提示死锁的存储过程的问题,而且其他问题导致的死锁堵塞的大排队。
可过了一个多月,现在又出现了死锁,我又适当删除了一些索引,并且把每个表都重建索引了( DBCC DBREINDEX(数据库名..表名,'',0)每个表都以这样的方式重建索引 ),死锁依然时而出现,这个时候我就不知道该怎么办了,因为我的数据库有几个表都几十万数据,有一个表一百多万,都是插入和查询比较平凡的表,为不会是因为数据量大导致的死锁呢?
几十万的数据会至于导致死锁吗?
如果是因为数据量大的原因,那么有什么好办法吗?我考虑过分表,比如把去年一年的数据存在到另一张结构相同的表, 但是这样的改动,在查询的时候很不方便。 有没有什么更好的办法吗?
我的表主键都是guid类型,默认主键聚集索引,我改成非聚集的,因为让物理存储顺序按guid列排序,应该是效率很低的,所以我的表基本上没有聚集索引,但我会根据查询的排序字段适当创建非聚集索引, 会不会是这个原因呢?
可过了一个多月,现在又出现了死锁,我又适当删除了一些索引,并且把每个表都重建索引了( DBCC DBREINDEX(数据库名..表名,'',0)每个表都以这样的方式重建索引 ),死锁依然时而出现,这个时候我就不知道该怎么办了,因为我的数据库有几个表都几十万数据,有一个表一百多万,都是插入和查询比较平凡的表,为不会是因为数据量大导致的死锁呢?
几十万的数据会至于导致死锁吗?
如果是因为数据量大的原因,那么有什么好办法吗?我考虑过分表,比如把去年一年的数据存在到另一张结构相同的表, 但是这样的改动,在查询的时候很不方便。 有没有什么更好的办法吗?
我的表主键都是guid类型,默认主键聚集索引,我改成非聚集的,因为让物理存储顺序按guid列排序,应该是效率很低的,所以我的表基本上没有聚集索引,但我会根据查询的排序字段适当创建非聚集索引, 会不会是这个原因呢?
二:还有定期重新生成索引,索引在使用一段时间后会有碎片。
三:建立表分区。
四:用SQL的性能分析功具找出哪些查询或是写入比较查资源,然后再找解决办法。一般来说一个表超过30万条数据就要小心了。
另外建议采用中间层缓存查询结果,不要频繁的访问数据库,同时使用一个好的ORM框架。
这个肯定是由于在程序上设计的问题,减少表的关联性,缩小表的字段数量,分离不需要经常访问的字段到其他表.尽量少用表关联.
SQL Server分区表