位置: 编程技术 - 正文

sql server 性能优化之nolock(sqlserver性能优化方案)

编辑:rootadmin

推荐整理分享sql server 性能优化之nolock(sqlserver性能优化方案),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:sqlserver性能优化5种方式,sqlserver性能优化,sqlserver性能优化,sqlserver性能优化方案有哪些,sqlserver性能优化论述,sqlserver性能优化方案有哪些,sqlserver性能优化论述,sqlserver性能优化与管理艺术pdf,内容如对您有帮助,希望把文章链接给更多的朋友!

伴随着时间的增长,公司的数据库会越来越多,查询速度也会越来越慢。打开数据库看到几十万条的数据,查询起来难免不废时间。

  要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑。其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能。

  不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有可能会造成Dirty Read,就是读到无效的数据。

  下面对于SQLSERVER的锁争用及nolock,rowlock的原理及使用作一个简单描述:

锁争用的描述

  那些不仅仅使用行级锁的数据库使用一种称为混和锁(lock escalation)的技术来获取较高的性能。除非很明确知道是针对整个数据表,否则这些数据库的做法是开始使用行级锁, 然后随着修改的数据增多,开始使用大范围的锁机制。

  不幸的是,这种混和锁的方法会产生和放大新的问题:死锁。如果两个用户以相反的顺序修改位于不同表的记录,而这两条记录虽然逻辑上不相关, 但是物理上是相邻的,操作就会先引发行锁,然后升级为页面锁。这样, 两个用户都需要对方锁定的东西,就造成了死锁。

例如:

  用户A修改表A的一些记录,引发的页面锁不光锁定正在修改的记录,还会有很多其它记录也会被锁定。

  用户B修改表B的一些记录,引发的页面锁锁定用户A和其它正在修改的数据。

  用户A想修改用户B在表B中锁定(并不一定正在修改的)数据。

  用户B想修改或者仅仅想访问用户A在表A中锁定(并不一定正在修改)的数据。

  为了解决该问题,数据库会经常去检测是否有死锁存在,如果有,就把其中的一个事务撤销,好让另一个事务能顺利完成。一般来说,都是撤销 那个修改数据量少的事务,这样回滚的开销就比较少。使用行级锁的数据库 很少会有这个问题,因为两个用户同时修改同一条记录的可能性极小,而且由于极其偶然的修改数据的顺序而造成的锁也少。

  而且,数据库使用锁超时来避免让用户等待时间过长。查询超时的引入也是为了同样目的。我们可以重新递交那些超时的查询,但是这只会造成数据库的堵塞。如果经常发生超时,说明用户使用SQL Server的方式有问题。正常情况是很少会发生超时的。

  在服务器负载较高的运行环境下,使用混合锁的SQL Server锁机制,表现不会很好。 原因是锁争用(Lock Contention)。锁争用造成死锁和锁等待问题。在一个多用户系统中,很多用户会同时在修改数据库,还有更多的用户在同时访问数据库,随时会产生锁,用户也争先恐后地获取锁以确保自己的操作的正确性,死锁频繁发生,这种情形下,用户的心情可想而知。

  确实,如果只有少量用户,SQL Server不会遇到多少麻烦。内部测试和发布的时候,由于用户较少,也很难发现那些并发问题。但是当激发几百个并发,进行持续不断地INSERT,UPDATE,以及一些 DELETE操作时,如何观察是否有麻烦出现,那时候你就会手忙脚乱地去解锁。

锁争用的解决方法

  SQL Server开始是用行级锁的,但是经常会扩大为页面锁和表锁,最终造成死锁。

sql server 性能优化之nolock(sqlserver性能优化方案)

  即使用户没有修改数据,SQL Server在SELECT的时候也会遇到锁。幸运的是,我们可以通过SQL Server 的两个关键字来手工处理:NOLOCK和ROWLOCK。

它们的使用方法如下:

NOLOCK的使用

  NOLOCK可以忽略锁,直接从数据库读取数据。这意味着可以避开锁,从而提高性能和扩展性。但同时也意味着代码出错的可能性存在。你可能会读取到运行事务正在处理的无须验证的未递交数据。 这种风险可以量化。

ROWLOCK的使用

  ROWLOCK告诉SQL Server只使用行级锁。ROWLOCK语法可以使用在SELECT,UPDATE和DELETE语句中,不过 我习惯仅仅在UPDATE和DELETE语句中使用。如果在UPDATE语句中有指定的主键,那么就总是会引发行级锁的。但是当SQL Server对几个这种UPDATE进行批处理时,某些数据正好在同一个页面(page),这种情况在当前情况下 是很有可能发生的,这就象在一个目录中,创建文件需要较长的时间,而同时你又在更新这些文件。当页面锁引发后,事情就开始变得糟糕了。而如果在UPDATE或者DELETE时,没有指定主键,数据库当然认为很多数据会收到影响,那样 就会直接引发页面锁,事情同样变得糟糕。

下面写一个例子,来说明一下NOLOCK的作用,这里使用一个有一万多条的数据库来测试,先不用NOLOCK来看一下:

这里为了是效果更加明显,使用了Select * ,来看一下执行结果,如下图:

这里显示的使用时间是ms,下面使用NOLOCK来看一下:

运行结果如下图:

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_a1ecb1.png" alt="查看图片" />

这次使用的时间是ms,差距体现出来了吧。个人感觉时间不应该差这么多,总之性能是提高了不少。

nolock和with(nolock)的几个小区别:

1.SQL Server 中的同义词,只支持with(nolock);

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

3.跨服务器查询语句时,不能用with (nolock) 只能用nolock,同一个服务器查询时则with (nolock)和nolock都可以用。比如:select * from [IP].a.dbo.table1 with (nolock) 这样会提示错误,select * from a.dbo.table1 with (nolock) 这样就可以成功地查询。

以上内容就是本文介绍sql server 性能优化之nolock的全部内容,希望对大家有所帮助。

sql语句实现四种九九乘法表 下面用while和if条件写的SQL语句的四种九九乘法表sql语句实现--x左下角九九乘法表DECLARE@IINT,@JINT,@SVARCHAR()SET@I=WHILE@IBEGINSET@J=SET@S=''WHILE@J=@IBEGINSET@S=@S+CAST(@JA

SQL中distinct的用法(四种示例分析) 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不

异步的SQL数据库封装详解 引言我一直在寻找一种简单有效的库,它能在简化数据库相关的编程的同时提供一种异步的方法来预防死锁。我找到的大部分库要么太繁琐,要么灵活

标签: sqlserver性能优化方案

本文链接地址:https://www.jiuchutong.com/biancheng/347389.html 转载请保留说明!

上一篇:数据库访问性能优化(数据库访问机制)

下一篇:sql语句实现四种九九乘法表(sql四种功能)

  • 小规模税控盘抵扣增值税报表怎么填
  • 一般纳税人购买二手车可以抵扣嘛
  • 跨区域涉税事项报告表怎么核销
  • 一般纳税人符合条件
  • 销售软件怎么做账
  • 行政事业单位暂付款无法收回该怎么处理
  • 列支会议费要求
  • 非独立核算的分公司可以开票吗
  • 商贸公司账目
  • 内部交易增值税怎么算
  • 购货方非增值税一般纳税人
  • 12月开的发票能抵下年度的所得税吗
  • 加速折旧的例子
  • 普票6个点怎么算
  • 同一地级行政区怎么称呼
  • 专项应付款需要偿还吗
  • 预付的费用没有还没有收到发票
  • 单位发的奖金怎样交个税
  • 政府奖励金额是否要交二次税呢
  • 年底有留抵税额需要结转吗
  • 留抵税额怎么入账
  • 印刷费可以开哪些科目
  • 公司变更税务处理?
  • 工资薪金所得税率表2023
  • 企业所得税法如何确认应税收入
  • 什么是会计凭证?会计凭证有哪些作用?
  • 实发工资和报税工资
  • 公司纳税高说明什么
  • 新办企业税务服务
  • php如何实现多进程
  • npscheck.exe - npscheck是什么进程 有什么用
  • 在建工程进项税额转出
  • php之间传递数据
  • php选择结构
  • 微信小程序全栈开发实战
  • vue中的provide/inject
  • 简单聊聊太平天国
  • 前端实现文件上传的命令
  • php微信公众号获取带参二维码
  • php中验证码如何实现登录验证
  • php、java、android、ios通用的3des方法(推荐)
  • 非财政补助结余分配和非财政拨款结余分配
  • 广东高速公路过路费收费标准
  • 下列项目的进项税额可以从销售税额中抵扣的是
  • 长期股权投资为什么不是所有者权益
  • 应税项目和非应税项目分类
  • mysqldump定时备份
  • 进项税额不得抵扣的情况
  • 公司购烟酒怎么入账
  • 开劳务发票需要的资料有哪些?
  • 出口货物预收账款分录
  • 质押发票
  • 劳务派遣公司收入确认税收政策
  • 金蝶财务软件固定资产
  • 购进的材料没有发票可以入库吗?
  • 施工企业应收账款确认依据
  • linux实现mysql数据库每天自动备份定时备份
  • 阿里云linux 服务器 字符集
  • 当恢复系数e=1时碰撞属于什么碰撞
  • 简述mysql的优势
  • win7系统ie浏览器怎么卸载重装
  • win7用固态
  • win10预览版退回正式版
  • Win10 Mobile Build 10572 其它未记录更新内容汇总
  • 如何修改windows默认语言
  • windows8怎么设置开机密码
  • 如何将win10系统从c盘迁移到d盘
  • linux服务器搭建实战详解
  • linux安装bz2
  • python怎么样学
  • python获取当前路径的方法
  • 预处理命令可以放在程序中的任何位置
  • js制作网站
  • jQuery实现表格文本框淡入更改值后淡出效果
  • 云南国税电子税务局官网登录
  • 怎样查询退休审核表
  • 税务登记证办理
  • 外地人在秦皇岛买房
  • 消费税的税目有什么
  • 服务类发票 如何入账
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设