Sql server 在INSERT语句中使用ROWLOCK(SQL Server)

Sql server 在INSERT语句中使用ROWLOCK(SQL Server),sql-server,Sql Server,对正在复制大量数据并将其插入同一个表的insert语句使用ROWLOCK是否明智 Ex) 有人对如何改进这一声明提出了建议吗,正如我所看到的,当SQL Server变得繁忙时,它将以SQL Server返回的超时查询结束。您最好先将子查询结果存储在一个临时表中,然后再插入该表。如果您插入大量数据,并且存在读写器问题(锁定、超时)在完成所有数据之前,您可能应该将插入内容拆分为多个部分(前100名或其他)。如果不这样做,即使声明rowlock,也可能会发生锁升级,在这种情况下,SQL server将

对正在复制大量数据并将其插入同一个表的insert语句使用ROWLOCK是否明智

Ex)


有人对如何改进这一声明提出了建议吗,正如我所看到的,当SQL Server变得繁忙时,它将以SQL Server返回的超时查询结束。

您最好先将子查询结果存储在一个临时表中,然后再插入该表。

如果您插入大量数据,并且存在读写器问题(锁定、超时)在完成所有数据之前,您可能应该将插入内容拆分为多个部分(前100名或其他)。如果不这样做,即使声明rowlock,也可能会发生锁升级,在这种情况下,SQL server将在插入数据时获取一个表锁

另一个好的选择是使用快照隔离,如果您有足够的可用空间,这将是完美的选择。 对于第一个选项,请阅读此处


如果插入大量数据,例如1000行或更多,则可以考虑使用临时表或表变量。首先将行插入临时表或变量中,然后执行插入最终表select*from temp table将非常有效。如果您需要更多的行,那么只需将insert放在一个游标中,并每隔1000行迭代一次,直到完成总行数


对于更复杂的插入,如果需要保留标识键,或将其用作其他表中的引用键,则可以将整个存储过程放入事务中,并从最终表中计算最后使用的标识键,并将其用作临时表标识键的第一个值,或者设置标识已关闭

那么,不能将WITH(NOLOCK)table提示与INSERT语句一起使用。看

如果在任何给定时间只有一个进程或应用程序在复制同一个表中的数据,那么不同的事务隔离级别对您没有多大帮助。它们旨在隔离(分离)不同的事务,对单个事务没有影响


此外,通常最好将查询优化委托给SQL Server,因为查询的所有必要元素都是已知的,并且(我假设)没有其他与同一个表竞争的查询,这可能会打乱优化的查询执行计划。

是要插入到新表中的表,或者是包含现有数据的现有表?您能解释一下为什么要这样做吗?还有,为什么要使用(nolock)提示?为什么会是这种情况?这将有效地使插入量增加一倍。
INSERT INTO TABLE with (rowlock) (id, name) 
   SELECT newid, name 
   FROM TABLE with (nolock) 
   WHERE id = 1