SQLServer中WITH(NOLOCK)知识点讲解
优点
有些文件说,加了with (nolock)的sql查询效率可以增加33%。 可以用于inner join 语句
缺点
会产生脏读 只适用与select查询语句
脏读: 一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。
详细内容:
要提升sql的查询效能,一般来说大家会以建立索引(index)为第一考虑。
其实除了index的建立之外,当我们在下sql command时,在语法中加一段with (nolock)可以改善在线大量查询的环境中数据集被lock的现象藉此改善查询的效能。
不过有一点千万要注意的就是,with (nolock)的sql select有可能会造成dirty read(脏读)。
例:
select count(userid)
from employee with (nolock)
join working_group with (nolock)
on employee.userid = working_group.userid
除了简单的select之外,有join的select语法也是可以使用的。
但是delete、insert、update这些需要transaction的指令就不行了
有些文件说,加了with (nolock)的sql查询效率可以增加33%。
加了with (nolock)即告诉sql server
我们的这段select指令无需去考虑目前table的transaction lock状态
因此效能上会有明显的提升
而且的lock现象会有明显的减少(包含dead lock)。
有 一点要特别注意,因为with (nolock)不考虑目前table的transaction lock
因此当有某些资料正处于多个phase交易
(例如跨多个table的transaction交易-->如提款系统)
with (nolock)会让目前处理交易process的数据被忽略…
讲白话一点,也就是说当使用nolock时
它允许那些已经修改但是还没有交易完成的数据。
因此如果有需要考虑transaction事务数据的实时完整性时
使用with (nolock)就要好好考虑一下。
如果不需考虑transaction,with (nolock)或许是个好用的参考。
注1:with ( < table_hint > )
指定由查询优化器使用的表扫描、一或多个索引
或由查询优化器利用此数据表以及为此语句使用锁定模式
注2:with (nolock)相当于read uncommitted