博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
with(nolock)的用法
阅读量:6839 次
发布时间:2019-06-26

本文共 1355 字,大约阅读时间需要 4 分钟。

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

with(nolock)的介绍

 

大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的。

 

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

 

1、脏读

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

2、不可重复读

一个用户的一个操作是一个事务,这个事务分两次读取同一条记录,如果第一次读取后,有另外用户修改了这个数据,然后第二次读取的数据正好是其它用户修改的数据,这样造成两次读取的记录不同,如果事务中锁定这条记录就可以避免。

3、幻读

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

 

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

 

二、实例

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

 

三、with(nolock)的使用场景

 

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

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

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

4、当使用NoLock时,它允许阅读那些已经修改但是还没有交易完成的数据。因此如果有需要考虑transaction事务数据的实时完整性时,使用WITH (NOLOCK)就要好好考虑一下。

 

 

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

 

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

2、with(nolock)的写法非常容易再指定索引。

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

 

转载地址:http://rfzul.baihongyu.com/

你可能感兴趣的文章
<备份>LVM总结
查看>>
工作日志的利器:迷人的MARKDOWN
查看>>
Solaris下挂载光盘
查看>>
说说苏宁易购
查看>>
Hibernate 和 Mybatis 两者相比的优缺点
查看>>
负载均衡器部署方式和工作原理
查看>>
MBProgressHUD使用
查看>>
例说DNS递归/迭代名称解析原理
查看>>
逐步展示
查看>>
台湾一老师演讲词值得中国人深思
查看>>
看2014视频三国杀
查看>>
微信“封杀”网易云音乐,真的错了吗?
查看>>
支付宝架构师:从工程师到架构师的成长之路
查看>>
android系统如何自适应屏幕大小
查看>>
十周第二次课(5月28日)
查看>>
推荐系统之信息茧房问题
查看>>
maven参数
查看>>
predis连接redis sentinel的问题处理
查看>>
js写码良好习惯
查看>>
shmall参数设置不当引起数据库启动时报out of memory报错
查看>>