博客园有许多关于nolock的文章,大部分都写得很好,例如:http://www.cnblogs.com/huangxincheng/p/4292320.html

这里仅结合个人项目,作为个人笔记记录。

nolock 的使用方法如:

select * from table1 with(nolock)

with 后面加“锁定提示”,具体的锁定提示有许多种,有表级别,页级别,行级别等等。具体可以参照上面的链接。

nolock 是锁定级别是:不采用任何锁。在允许脏读的情况下,使用nolock可以提升查询性能避免锁定数据。关键词就是加粗部分了。

脏读的意思是:读取了其它事务中未提交的数据,但该事务可能被回滚。

首先要明确的是,sql server 对于 insert/update/delete 都会加上排它锁,也就是在这几个操作进行时,其它的操作都必须进行等待。而对于select会加上共享锁,也就是在读取时,其它操作只能进行读取。看一个简单的测试,新建两个查询窗口,sql如下:

--查询窗口一
begin tran
update test set c = '2' where id = 2 --查询窗口二
select * from test where id = 2

当查询窗口一的事务没有提交时,其它查询是无法读取的。这是sql server 的默认隔离级别,保证了不会出现脏读。接着我们用 nolock 来测试,查询窗口二的sql改为:

--查询窗口二
select * from test with(nolock) where id = 2

可以看到,即使查询窗口一的事务没有提交,数据依然可以被读取出来。那什么时候出现脏读呢?很简单,当事务rollback时,就读取到脏数据了。

对于一些对数据要求严格的系统,脏读是不可接受的,那么nolock 也就不能使用。但许多时候,我们的查询是可以允许脏读的,因为它带来许多好处。

1. 提升查询性能

从上面的例子可以看到,nolock不受锁的影响,这表示它可以直接读取数据,而不用等到锁释放。

2. 避免锁定数据

这个好处从上面的链接可以理解得更好。有时候我们的 select 可能也是耗时的,上面说到,select会加上共享锁,也就是select的时候,其它事务例如update是无法进行的,如果我们的select执行太久,那么其它操作就可能会因为超时而执行失败。

sql server 使用nolock提升性能的更多相关文章

  1. SQL Server 2016 查询存储性能优化小结

    SQL Server 2016已经发布了有半年多,相信还有很多小伙伴还没有开始使用,今天我们来谈谈SQL Server 2016 查询存储性能优化,希望大家能够喜欢 作为一个DBA,排除SQL Ser ...

  2. SQL Server 2014里的性能提升

    在这篇文章里我想小结下SQL Server 2014引入各种惊艳性能提升!! 缓存池扩展(Buffer Pool Extensions) 缓存池扩展的想法非常简单:把页文件存储在非常快的存储上,例如S ...

  3. 智能SQL优化工具--SQL Optimizer for SQL Server(帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 )

    SQL Optimizer for SQL Server 帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 SQL Optimizer for SQL Server 让 SQL Serve ...

  4. SQL Server with(nolock)详解

    大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的. 什么是并发访问:同一时间有多个用户访问同一资源,并发 ...

  5. 为什么SQL语句Where 1=1 and在SQL Server中不影响性能

        最近一个朋友和我探讨关于Where 1=1 and这种形式的语句会不会影响性能.最后结论是不影响.     虽然结论正确,但对问题的认识却远远没有解决问题的根本.实际上在T-SQL语句的书写过 ...

  6. SQL Server 2014如何提升非在线的在线操作

    在今天的文章里,我想谈下在线索引重建操作( Online Index Rebuild operations),它们在SQL Server 2014里有怎样的提升.我们都知道,自SQL Server 2 ...

  7. SQL Server磁盘I/O性能分析

    SQL Server中的I/O操作类型: 1.对于内存中没有缓存的数据,第一次访问时需要将数据从所在的页面从数据文件中读取到内存中 2.在任何Insert/Update/Delete提交前,SQL S ...

  8. 【SQL server初级】数据库性能优化二:数据库表优化

    数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第二部分 数据库性能优化二:数据库表优化 优化①:设计规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询 ...

  9. 【SQL server初级】数据库性能优化一:数据库自身优化(大数据量)

    数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第一部分 数据库性能优化一:数据库自身优化 优化①:增加次数据文件,设置文件自动增长(粗略数据分区) 1.1:增加次数据文 ...

随机推荐

  1. qq空间返回顶部代码

    点击这里体验效果 以下是源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  2. JAVA静态代理模式(从现实生活角度理解代码原理)

    代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式说白了就是"真实对象"的代表,在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途. 在 ...

  3. iOS--xuer(registration)

    这个登录页面包含了自适应屏幕的大小,数字用户登录键盘是数字键盘.隐藏键盘.隐藏密码等等. ViewController.h #import <UIKit/UIKit.h> #import ...

  4. linux版基金看板

    程序员的吊丝们,还在害怕上班时偷偷看基金被老板发现吗?今天你们的福利来了,专属程序员吊丝一族的礼物,linux版基金看板. 优点: 1.自定义设置关注基金 2.linux系统,让别人可以以为你一直都在 ...

  5. 从0到1,教你实现基于Ruby的watir-webdriver自动化测试

    一.为什么选择Ruby []完全开源. []多平台:Ruby可以运行在Linux, UNIX, Windows, MS-DOS, BeOS, OS/.. []多线程:线程就是指在一个程序中处理若干控制 ...

  6. js 随机生成姓名、手机号、身份证号、银行卡号

    开发测试的时候,经常需要填写姓名.手机号.身份证号.银行卡号,既要符合格式要求.又不能重复.大家会到网上搜各种生成器.能不能自己写一个简单的生成器呢.下面是随机生成姓名.手机号.身份证号.银行卡号的j ...

  7. 项目管理过程组和知识领域表(PMBOK2008)

    项目管理过程组和知识领域表(PMBOK2008) 知识领域 项目管理过程组 启动过程组 规划过程组 执行过程组 监控过程组 收尾过程组  4. 项目整合管理 4.1 制定项目章程 4.2 制定项目管理 ...

  8. C# CompareTo 和 String.Compare

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. php之验证码小程序

    验证码功能(个人理解): 减轻服务器的压力(如12306的验证码功能): 防止暴力注册 个人思路:在a-z,A-Z,1-9生成n位随机的数来构成新的验证码. 关于生成验证码的几个小函数 range() ...

  10. C++基础——模拟事务 (1)COMMAND模式

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...