with (nolock)当你应该/不应该使用它时,有人可以解释使用查询的含义吗?
例如,如果您的银行应用程序具有较高的事务率和某些表中的大量数据,那么哪些类型的查询可以解决?是否应该经常使用它/从不使用它?
我想真正的问题是:
如果我不关心脏读,将添加with(NOLOCK)提示到SELECT语句会影响性能:
例:
Select *
from aTable with (NOLOCK)
Run Code Online (Sandbox Code Playgroud) 我有由N个线程并发处理的表.
CREATE TABLE [dbo].[Jobs]
(
[Id] BIGINT NOT NULL CONSTRAINT [PK_Jobs] PRIMARY KEY IDENTITY,
[Data] VARBINARY(MAX) NOT NULL,
[CreationTimestamp] DATETIME2(7) NOT NULL,
[Type] INT NOT NULL,
[ModificationTimestamp] DATETIME2(7) NOT NULL,
[State] INT NOT NULL,
[RowVersion] ROWVERSION NOT NULL,
[Activity] INT NULL,
[Parent_Id] BIGINT NULL
)
GO
CREATE NONCLUSTERED INDEX [IX_Jobs_Type_State_RowVersion] ON [dbo].[Jobs]([Type], [State], [RowVersion] ASC) WHERE ([State] <> 100)
GO
CREATE NONCLUSTERED INDEX [IX_Jobs_Parent_Id_State] ON [dbo].[Jobs]([Parent_Id], [State] ASC)
GO
Run Code Online (Sandbox Code Playgroud)
作业正在添加到表中State=0 (New)- 它可以被此状态下的任何工作者使用.当worker获取此队列项时,State更改为,50 (Processing)并且其他使用者无法使用该作业(工作程序[dbo].[Jobs_GetFirstByType] …
实际上我不确定标题是否准确描述了这个问题,但我希望它足够接近.
我有一些代码从数据库表执行SELECT,我知道这将导致大约150万行被选中.每行中的数据不大 - 每行可能20个字节.但这仍然是30MB的数据.每行包含一个客户编号,我需要为每个客户做一些事情.
我的代码看起来像:
SqlConnection conn = new SqlConnection(connString);
SqlCommand command = new SqlCommand("SELECT ... my select goes here", conn);
using (conn)
{
conn.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while(reader.Read())
{
... process the customer number here
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我只是迭代SELECT返回的所有客户.
我的问题是,这会导致数据库的多次读取,还是只读取一次?我假设网络缓冲区不足以容纳30MB的数据,那么.NET在这里做什么呢?每次Read()推进指针时,SELECT的结果是否会让某些地方的SQLDataReader啃掉一行?还是回到数据库?
我问的原因是代码中的"...处理客户编号"部分可能需要一些时间,因此对于150万客户而言,代码(上面的while循环)将花费很多时间来完成.当发生这种情况时,我是否需要担心其他人在数据库上阻挡我,或者我知道我已经从数据库中完成了一个SELECT并且我不会再回来了吗?