SQL Server死锁的分析、处理与预防(二)

2015-01-24 01:42:27 · 作者: · 浏览: 9
数据量达到1000w级的表中,我们采用char(10)来保存日期值,虽然INSERT、UPDATE、DELETE时没有问题,但是在执行SELECT且这个日期值字段作为过滤条件时发生性能问题是必然的。经过测试,这个字段的数据类型改为datetime时的执行时间不到性能优化后的10%。

所以,不但是在开发阶段,早在设计阶段就已经有了性能隐患。

4.5 升级硬件

不赘述。

5、 如何预防

首先要理解,在多并发的环境中死锁是不可避免的,只能通过合理的数据库设计、

良好的索引、适当的查询语句以及隔离等级等措施尽量减少死锁。

最开始列出了死锁的4个必要条件,只要想办法破坏任意1个或多个条件就可以避免产生死锁。下列方法有助于最大限度的降低死锁:

a) 按同一顺序访问对象;

\

?

b)避免事务中的用户交互,也就是在事务执行过程中不要包含用户交互的步骤; c)保持事务简短并在一个批处理中; d)SELECT语句加WITH(NOLOCK)提示;

SELECT * FROM TABLE1 WITH(NOLOCK);

SELECT * FROM TABLE2 WITH(NOLOCK);

这种写法在执行中不对查询到的资源加锁,就允许2条SQL可以并发地访问同一资源。但是加WITH(NOLOCK)提示可能会导致脏读!!!

e)使用较低的隔离级别;

暂不需要了解,不赘述。 f)使用绑定连接;

处理程序端的死锁,非数据库端,不赘述。

6、 结束语

项目实施过程中遇到死锁现象在所难免。通过前面的介绍,希望大家能够对它

有一个比较简单的认识,在遇到异常情况的时候不至于束手无策。如果以上内容有什么技术上不对的问题或观点,欢迎大家直接向我提出来一起研究沟通,也欢迎大家在遇到其它数据库方面的问题时能和我一起探讨,共同提高。