with(nolock)的用法

本文导读:要提高SQL的查询效能,通常来讲你们会以创建索引(index)为第一考虑。其实除了index的创建以外,当咱们在下SQL Command时,在语法中加一段WITH (NOLOCK)能够改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能。不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有可能会形成Dirty Read。html

with(nolock)的介绍安全

 

你们在写查询时,为了性能,每每会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提升查询速度的目的。服务器

 

当同一时间有多个用户访问同一资源,并发用户中若是有用户对资源作了修改,此时就会对其它用户产生某些不利的影响,例如:并发

 

一、脏读性能

一个用户对一个资源作了修改,此时另一个用户正好读取了这条被修改的记录,而后,第一个用户放弃修改,数据回到修改以前,这两个不一样的结果就是脏读。spa

二、不可重复读htm

一个用户的一个操做是一个事务,这个事务分两次读取同一条记录,若是第一次读取后,有另外用户修改了这个数据,而后第二次读取的数据正好是其它用户修改的数据,这样形成两次读取的记录不一样,若是事务中锁定这条记录就能够避免。blog

三、幻读索引

指用户读取一批记录的状况,用户两次查询同一条件的一批记录,第一次查询后,有其它用户对这批数据作了修改,方法多是修改,删除,新增,第二次查询时,会发现第一次查询的记录条目有的不在第二次查询结果中,或者是第二次查询的条目不在第一次查询的内容中。事务

 

NOLOCK 语句执行时不发出共享锁,容许脏读 ,等于 READ UNCOMMITTED事务隔离级别 。nolock确实在查询时能提升速度,但它并非没有缺点的,起码它会引发脏读、只适用与select查询语句。 在一些不须要考虑脏读的场合会用到,例如当用户在论坛发广告贴时删除其全部发帖,这个查询就不怕脏读,全删,或者漏一个正在发的都不是问题。

 

2、实例

 
SQL 代码    复制
SELECT  COUNT(UserID)   
FROM    EMPLOYEE WITH (NOLOCK)           
JOIN WORKING_GROUP WITH (NOLOCK)           
ON EMPLOYEE.UserID = WORKING_GROUP.UserID  

 

3、with(nolock)的使用场景

 

1:数据量特别大的表,牺牲数据安全性来提高性能是能够考虑的;

2:容许出现脏读现象的业务逻辑,反之一些数据完整性要求比较严格的场景就不合适了,像金融方面等。

3:数据不常常修改的表,这样会省于锁定表的时间来大大加快查询速度。

四、当使用NoLock时,它容许阅读那些已经修改可是尚未交易完成的数据。所以若是有须要考虑transaction事务数据的实时完整性时,使用WITH (NOLOCK)就要好好考虑一下。
 

 

4、nolock和with(nolock)的几个小区别

 

一、SQL05中的同义词,只支持with(nolock);

二、with(nolock)的写法很是容易再指定索引。

三、跨服务器查询语句时 不能用with (nolock) 只能用nolock,同一个服务器查询时 则with(nolock)和nolock均可以用

转自:https://www.cnblogs.com/cjm123/p/8303048.html

相关文章
相关标签/搜索