我想真正的问题是:
如果我不关心脏读,向SELECT语句添加with (NOLOCK)提示会影响以下语句的性能:
- 当前SELECT语句
- 针对给定表的其他事务
例子:
Select *
from aTable with (NOLOCK)
我想真正的问题是:
如果我不关心脏读,向SELECT语句添加with (NOLOCK)提示会影响以下语句的性能:
例子:
Select *
from aTable with (NOLOCK)
1) Yes,NOLOCK
的 Select 将比正常 Select 更快完成.
2) Yes,如果 Select 值为NOLOCK
,则针对受影响表的其他查询将比正常 Select 更快完成.
Why would this be?
NOLOCK
通常(取决于你的数据库引擎)意味着把你的数据给我,我不在乎它处于什么状态,也不介意在你阅读数据时把它保持静止.它的速度更快,资源密集度更低,而且非常危险.
应该警告您,不要从系统关键的位置进行更新或执行任何操作,或者使用源自NOLOCK
次读取的数据要求绝对正确.此数据绝对可能包含在查询运行期间删除的行,或在其他尚未完成的会话中删除的行.此数据可能包括已部分更新的行.此数据可能包含违反外键约束的记录.此数据可能不包括已添加到表中但尚未提交的行.
You really have no way to know what the state of the data is.
如果您试图获取行计数或其他可以接受一定误差的摘要数据,那么NOLOCK
是提高这些查询性能并避免它们对数据库性能产生负面影响的好方法.
Always use the 100 hint with great caution and treat any data it returns suspiciously.