Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 在MSSQL 2008中,如何在不锁定目标表的情况下插入/选择?_Sql Server 2008 - Fatal编程技术网

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

我正在重构这个过程,我认为这不是最好的方法。是否有更好的(最好是事务安全的)方法可以一次复制所有行而不锁定目标表?

可以使用表分区吗

  • 在某个列(如日期或增量batchID)上对目标表和临时表进行分区

  • 完成转移后,将分区切换到处理表

  • 处理完成后,您可以将处理过的分区切换出去并截断它


  • 这已经在前面讨论过了。我在研究时发现了这一点,但它只描述了批量插入,而没有复制行。我希望有一种方法可以让它在一条语句中工作,或者在另一条语句中,使用一个事务安全的SP进行复制。它描述了如何使用大容量插入来实现您的要求,不是吗?首先,它说另一种方法是分批插入以避免表锁。唯一的答案是将表转储到文件中,然后批量插入表,这与OP要求的完全相反,因为他已经在表中获得了数据。所以我不认为这是一个很好的答案。它还说,插入4000块应该避免锁定整个表,但这基本上是我已经在做的事情,但我通过从客户机打很多电话来做到这一点,如果客户机死了,我会有一个半承诺的事务,我正试图避免。