文档章节

sql SELECT时的with(nolock)选项说明

writeademo
 writeademo
发布于 2016/10/21 09:26
字数 667
阅读 42
收藏 0

 

sql SELECT时的with(nolock)选项说明

要提升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  

因为SQL Server会执行对应的锁定一致性检查。 欲改善整体数据库查询的效能,请将WITH (NOLOCK)加在您的SELECT语法中Table名称的后面,虽然(NOLOCK)也可以,但是微软还是建议大家要加WITH。

除了简单的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

 

最后说下nolock和with(nolock)的几个小区别:

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

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

跨服务器查询语句时 不能用with (nolock) 只能用nolock

同一个服务器查询时 则with (nolock)和nolock都可以用

比如

SQL code
select * from [IP].a.dbo.table1 with (nolock) 这样会提示用错误select * from a.dbo.table1 with (nolock) 这样就可以

参考blog

http://www.cnblogs.com/kerrycode/p/3946268.html

本文转载自:

writeademo
粉丝 25
博文 642
码字总数 232766
作品 0
东城
私信 提问
SQL Server常用命令

查看被锁表: select requestsessionid spid,OBJECTNAME(resourceassociatedentityid) tableName from sys.dmtranlocks where resource_type='OBJECT' spid 锁表进程 tableName 被锁表名 解锁......

straymouse
2017/05/06
0
0
SQL Server锁类型

(1) HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁。    (2) NOLOCK:不添加共享锁和排它锁,当这个选项生效后,可能读到未提交读的数据或“脏数...

浩爷
2016/06/19
441
0
WITH (NOLOCK)的作用和优缺点

缺点: 1.会产生脏读 2.只适用与select查询语句 优点: 1.有些文件说,加了WITH (NOLOCK)的SQL查询效率可以增加33%。 2.可以用于inner join 语句 脏读: 一个用户对一个资源做了修改,此时另外一...

digsourse
2014/11/03
49
0
代码生成器Sql Server 和 Mysql 数据库脚本

#SQL SERVER private string SqlTableList = @"SELECT so.name, Convert( VARCHAR(10), ep.[value]) AS [description] FROM sysobjects so(NOLOCK) LEFT JOIN sys.extended_properties ep(NO......

-wangming-
2015/05/31
278
0
并发问题,锁,怎么处理死锁,脏数据处理

SQL Server死锁总结 1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。 死锁...

pczhangtl
2014/08/03
4.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Alibaba 实战(二) - 关于Spring Boot你不可不知道的实情

0 相关源码 1 什么是Spring Boot 一个快速开发的脚手架 作用 快速创建独立的、生产级的基于Spring的应用程序 特性 无需部署WAR文件 提供starter简化配置 尽可能自动配置Spring以及第三方库 ...

JavaEdge
今天
7
0
TensorFlow 机器学习秘籍中文第二版(初稿)

TensorFlow 入门 介绍 TensorFlow 如何工作 声明变量和张量 使用占位符和变量 使用矩阵 声明操作符 实现激活函数 使用数据源 其他资源 TensorFlow 的方式 介绍 计算图中的操作 对嵌套操作分层...

ApacheCN_飞龙
今天
7
0
五、Java设计模式之迪米特原则

定义:一个对象应该对其他对象保持最小的了解,又叫最小知道原则 尽量降低类与类之间的耦合 优点:降低类之间的耦合 强调只和朋友交流,不和陌生人说话 朋友:出现在成员变量、方法的输入、输...

东风破2019
昨天
23
0
jvm虚拟机结构

1:jvm可操作数据类型分为原始类型和引用类型,因此存在原始值和引用值被应用在赋值,参数,返回和运算操作中,jvm希望在运行时 明确变量的类型,即编译器编译成class文件需要对变量进行类型...

xpp_ba
昨天
5
0
聊聊nacos Service的processClientBeat

序 本文主要研究一下nacos Service的processClientBeat Service.processClientBeat nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/Service.java public class Service ex......

go4it
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部