Sql server 2008 在MSSQL 2008中,如何在不锁定目标表的情况下插入/选择?
我有一个进程,它需要将许多行(可能是几十行或几十万行)从一个暂存表复制到另一个表中,并在其中进行处理 通常,我会说Sql server 2008 在MSSQL 2008中,如何在不锁定目标表的情况下插入/选择?,sql-server-2008,Sql Server 2008,我有一个进程,它需要将许多行(可能是几十行或几十万行)从一个暂存表复制到另一个表中,并在其中进行处理 通常,我会说 insert into production_table select * from staging_table 但此语句可能需要一个小时才能运行,因此为了不锁定处理表,我们使用客户端应用程序中的以下逻辑将下1000行移到生产表中: do { max_id = select max(id) from production_table where jobid = YYY
insert into production_table select * from staging_table
但此语句可能需要一个小时才能运行,因此为了不锁定处理表,我们使用客户端应用程序中的以下逻辑将下1000行移到生产表中:
do
{
max_id = select max(id) from production_table where jobid = YYY
insert into production_table (jobid, ...)
select top 1000 jobid, ... from staging_table
where id > @max_id
order by id asc
} while @row_count = 1000
我正在重构这个过程,我认为这不是最好的方法。是否有更好的(最好是事务安全的)方法可以一次复制所有行而不锁定目标表?可以使用表分区吗
这已经在前面讨论过了。我在研究时发现了这一点,但它只描述了批量插入,而没有复制行。我希望有一种方法可以让它在一条语句中工作,或者在另一条语句中,使用一个事务安全的SP进行复制。它描述了如何使用大容量插入来实现您的要求,不是吗?首先,它说另一种方法是分批插入以避免表锁。唯一的答案是将表转储到文件中,然后批量插入表,这与OP要求的完全相反,因为他已经在表中获得了数据。所以我不认为这是一个很好的答案。它还说,插入4000块应该避免锁定整个表,但这基本上是我已经在做的事情,但我通过从客户机打很多电话来做到这一点,如果客户机死了,我会有一个半承诺的事务,我正试图避免。