`

WITH (NOLOCK)

阅读更多
http://www.cnblogs.com/henw/archive/2011/07/22/2113580.html

缺点:

  1.会产生脏读

  2.只适用与select查询语句

优点:

  1.有些文件说,加了WITH (NOLOCK)的SQL查询效率可以增加33%。

  2.可以用于inner join 语句

脏读: 一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。

详细内容:

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

除了简单的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
分享到:
评论

相关推荐

    EFCore.SqlServer.WithNoLock

    标题“EFCore.SqlServer.WithNoLock”涉及到的是在C#编程环境中使用Entity Framework Core(简称EF Core)与SQL Server数据库进行交互时,如何利用“WITH (NOLOCK)”提示来提高查询性能。这是一个针对数据库事务隔离...

    SQL Server的WITH (NOLOCK)

    缺点:  1.会产生脏读  2.只适用与select查询语句  优点:  1.有些文件说,加了WITH (NOLOCK)的SQL...其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环

    sqlserver中with(nolock)深入分析

    在SQL Server中,`WITH (NOLOCK)`和`READPAST`是两种不同的事务隔离级别,它们用于处理并发控制和避免死锁问题。在处理数据库死锁时,这两个选项经常被推荐作为解决策略,但使用时需谨慎,因为它们可能会引入其他...

    sql server 性能优化之nolock

    然而,除了索引优化,使用`WITH (NOLOCK)`或`NOLOCK`也可以帮助减少锁竞争,提升查询效率。在SQL命令中添加`WITH (NOLOCK)`,可以防止数据集在大量并发查询时被锁定,降低系统资源消耗,从而提高整体性能。 然而,`...

    Laravel开发-nolock

    然而,如果在读取数据时使用了`WITH(NOLOCK)`这样的SQL提示符,那么可以实现无锁读取,这在大数据查询或低并发环境下可能是一个有效的优化策略。 无锁读取(NOLOCK)的使用需谨慎,因为它可能会读取到未提交的数据...

    sql中的select语句查询介绍

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

    Net数据库备份与还原

    2. **使用WITH NOLOCK提示**:在SELECT查询中添加此提示,允许读取脏数据,但可能导致不一致的结果。这仅适用于无事务备份,且数据一致性不重要的情况。 3. **计划备份在低峰时段**:安排备份在系统负载较低的时候...

    微软内部资料-SQL性能优化3

    Another type of table lock is a schema stability lock (Sch-S) and is compatible with all table locks except the schema modification lock (Sch-M). The schema modification lock (Sch-M) is incompatible ...

    SQL Server 2008基础教程

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

    从SQL Server中的表中删除重复的行

    在执行任何删除操作前,最好先备份数据或使用`WITH NOLOCK`提示来创建一个只读的临时视图。同时,也可以考虑使用`ALTER TABLE ... ADD CONSTRAINT`来添加唯一约束,以防止未来数据的重复插入。 综上所述,删除SQL ...

    必须会的SQL语句(四) 数据删除和更新

    在SQL Server中,数据操作是数据库...在执行这些操作前,最好备份数据,或者使用`WITH NOLOCK`等提示来避免锁定问题,同时理解它们对数据库性能的影响。在处理大量数据时,合理规划事务管理和错误处理也是十分必要的。

    全国身份证+车牌+省市表

    SELECT ca.code,ca.name,ca.ParentCode,az.name,az.latitude,az.longitude FROM CarArea ca WITH(NOLOCK) LEFT JOIN ( SELECT * FROM AreaZoon WITH(NOLOCK) WHERE parentCode='0' ) az ON az.proshortname=ca....

    SQL Server SQL优化

    - **推荐做法**:使用`UNION ALL`代替`UNION`以提高合并效率,如`SELECT * FROM A WITH (NOLOCK) WHERE Verify = 3 UNION ALL SELECT * FROM A WITH (NOLOCK) WHERE Verify = 1`。 - **不推荐做法**:直接使用`UNION...

    使用正则表达式匹配tsql注释语句

    代码如下:–获取表的count信息select count(*) from T with(nolock) –获取特定值的count信息select count(*) from T with(nolock)where v = ‘–value’ –获取表’T’的count信息select count(*) from T with...

    参考sql2012存储过程写的统计所有用户表尺寸大小的示例

    (SELECT MAX(row_count) FROM sys.dm_db_partition_stats p WITH(NOLOCK) WHERE p.object_id = t.object_id AND p.index_id ) AS Rows, (SELECT COUNT(1) FROM dbo.syscolumns WITH(NOLOCK) WHERE id = t.object_...

    SQL 字符处理

    SELECT * FROM PbMatchineItem WITH (NOLOCK) WHERE ISNUMERIC(remarks) &lt;&gt; 0 -- 只取数字记录(小) SELECT * FROM PbMatchineItem WITH (NOLOCK) WHERE ISNUMERIC(remarks) = 0 -- 不取数字记录 ``` 这段代码展示了...

    SQLServer2008Dialect

    SQLServer2008Dialect 优化了原来的分页查询数据方法以及在生成SQL时表后增加了with(nolock)

    hibernate SQLServer2008Dialect

    SQLServer2008Dialect 优化了原来的分页查询数据方法以及在生成SQL时表后增加了with(nolock)

Global site tag (gtag.js) - Google Analytics