`
calhaha
  • 浏览: 20783 次
  • 性别: Icon_minigender_1
  • 来自: 新加坡
最近访客 更多访客>>
社区版块
存档分类
最新评论

SELECT时的with(nolock)选项说明

阅读更多

I used to see my senior developers use WITH (NOLOCK) when querying in SQL Server and wonder why they use. Now i explored it and found that it's useful to improve the performance in executing the query . However there is a disadvantage in using it. The disadvantage is that one may not be sure that they are getting the data which is currently being updated in the Table, ie, Without lock protection, you cannot be guaranteed that the data isn't changing during the time that the query is running. I referred this link and found it pretty useful.

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

分享到:
评论

相关推荐

    sql中的select语句查询介绍

    查询完成后,你不应该忘记手动关闭它们,除非使用`WITH NOLOCK`选项来避免自动锁定。如果表已经打开,`SELECT`会使用`USE ... AGAIN`重新打开。 `SELECT`子句允许你指定一系列返回的结果,包括: 1. 通配符`*`代表...

    SQL server 中锁机制详解

    NoLock 选项(with (NoLock))若想浏览数据,但不更改,且不需要精确的数据,则可用 with(NoLock),可以提高响应速度。 事务隔离级别缺省情况下,SQL Server 采用保守的方法(悲观锁)来进行并发控制。Oracle 使用...

    SQL 字符处理

    - `WITH (NOLOCK)`:此选项表示读取数据时不加锁,可以提高查询性能,但可能会读取到未提交的数据。 - `ISNUMERIC(remarks)`:这是一个 SQL Server 的内置函数,用于判断一个字符串是否全部由数字组成。 #### 3. ...

    sqlserver2008锁表语句详解(锁定数据库一个表)

    使用`SELECT * FROM table WITH (NOLOCK)`,SQL Server在执行查询时不会施加任何锁,允许读取未提交的数据(脏读),这等同于设置事务隔离级别为`READ UNCOMMITTED`,可能会导致不一致的数据读取。 4. **UPDLOCK**...

    C#的Sql server学习笔记

    - **功能:** 此选项使得在读取数据时,SQL Server会保留对数据的锁直到事务结束。 - **用途:** 防止其他事务修改被锁定的数据行。 **2. SELECT * FROM table WITH (TABLOCKX):** - **功能:** 此选项使得在读取...

    sql锁表与解锁

    SELECT * FROM table WITH (HOLDLOCK) 这条语句将锁定表 "table",使其他事务不能更新或删除该表,但可以读取该表。 锁选项 SQL Server 提供了多种锁选项,用于实现不同的锁表方式。这些锁选项包括: * NOLOCK...

    sybase锁表检查与解决方法

    WITH (NOLOCK)`: 使用此选项查询数据时,将不会获取任何锁,可以避免阻塞。 3. `ALTER TABLE ... WITH (TABLOCK)`: 在修改表结构时,可以使用此命令获得表级锁,确保其他操作不会并行进行。 四、bcp工具 `bcp`是...

    sql server优化事务处理

    建议提前读取数据,或在必要时使用`WITH (NOLOCK)`提示,但需注意这可能导致脏读。 3. **避免用户交互**:在事务中等待用户响应会延长事务执行时间,占用资源。设计时应尽量避免这种情况,确保事务快速执行并释放...

    sql server 中的sql总结

    - `WITH (NOLOCK)`: 表示读取数据时不加锁。 #### 十五、查询操作 - **插入数据** - 使用 `INSERT INTO` 命令向表中插入新记录。 ```sql INSERT INTO [表名] VALUES (...); ``` - **删除数据** - 使用 `...

    sqlserver锁表、解锁、查看销表的方法

    1. **HOLDLOCK**:使用`WITH (HOLDLOCK)`选项时,它会将共享锁(S锁)保持到事务结束,这允许其他事务读取表,但不允许更新或删除操作。这种方式通常用于防止幻读现象,即在事务期间,其他事务插入的数据在当前事务...

    SQL Server 2008基础教程

    使用WITH NOLOCK避免锁定问题。 - **查询数据**:SELECT语句是最基本的操作,结合WHERE、GROUP BY、HAVING、ORDER BY等子句进行复杂查询。 ### 五、事务与并发控制 - **事务**:事务是一系列数据库操作的集合,...

    oracle中UPDATE nowait 的使用方法介绍

    在 SQL Server 中,类似的机制是 `WITH (NOLOCK)`,但它不加锁,而是读取可能未提交的更改(称为“脏读”)。而在 Oracle 中,`NOWAIT` 是为了加锁和同步,防止数据不一致,而不是为了读取未提交的数据。 4. **...

Global site tag (gtag.js) - Google Analytics