zoukankan      html  css  js  c++  java
  • SQL中with(nolock)作用说明

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

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

    例如:

    SELECTCOUNT(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) 这样就可以
    作者:七步、 出处:http://www.cnblogs.com/dongyu9521/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    解读setTimeout, promise.then, process.nextTick, setImmediate的执行顺序
    规范git commit提交记录和版本发布记录
    《Javascript设计模式与开发实践》--读书笔记
    一个简洁明了的表达式拼接例子.md
    前端知识分享.md
    PHP常用框架.md
    关于软件版本以及VS版本扩展介绍
    WPF 优秀控件.md
    Deepin 常见问题锦集
    一些面向对象的设计法则
  • 原文地址:https://www.cnblogs.com/dongyu9521/p/3613276.html
Copyright © 2011-2022 走看看