Sql server 如何防止大容量插入阻塞SQL Server中的整个数据库(受影响表以外的表)?

Sql server 如何防止大容量插入阻塞SQL Server中的整个数据库(受影响表以外的表)?,sql-server,Sql Server,我使用批量插入将一组大文件(多达1亿条记录)插入数据库,以替换现有数据 最初这需要大约5分钟,这有点太慢了,因为它在更新过程中锁定了生产表(为此,最多应该等待2-3分钟)。为了加快速度,我创建了一个暂存表,从中在SQL Server内部复制数据(测试时大约快5倍)。当时的想法是,至少生产表被锁定的时间更短。但是,现在看来整个数据库在更新过程中都被锁定了,即使是更新过程中没有使用的表 这是正常的行为吗?如何预防这种情况?我在谷歌上搜索了很多,所有问题都与正在更新的表的锁定有关,而不是与之无关的表

我使用批量插入将一组大文件(多达1亿条记录)插入数据库,以替换现有数据

最初这需要大约5分钟,这有点太慢了,因为它在更新过程中锁定了生产表(为此,最多应该等待2-3分钟)。为了加快速度,我创建了一个暂存表,从中在SQL Server内部复制数据(测试时大约快5倍)。当时的想法是,至少生产表被锁定的时间更短。但是,现在看来整个数据库在更新过程中都被锁定了,即使是更新过程中没有使用的表

这是正常的行为吗?如何预防这种情况?我在谷歌上搜索了很多,所有问题都与正在更新的表的锁定有关,而不是与之无关的表

对于单个表,此表包含大容量插入:

truncate table SomeSchema.TradesStaging
BULK INSERT SomeSchema.TradesStaging
FROM '\\SomePath\SomeSchema.Trades.tab'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = '\t',  
    ROWTERMINATOR = '\n',
    TABLOCK
)           
内部复制如下所示:

if EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'SomeSchema' AND  TABLE_NAME = 'Trades') begin drop table SomeSchema.Trades end 
select * into SomeSchema.Trades from SomeSchema.TradesStaging

--a lot of code recreating indexes etc. down here.
所有代码都被包装到一个存储过程中,如下所示(仅包含上述示例):


是否确实需要删除SomeSchema.Trades表?这将导致架构锁定。为什么不直接截断表并重新加载它呢?此外,您还可以禁用并重新启用索引以帮助加快速度。

我这样做是因为这似乎是用最少的日志记录复制数据的最简单方法,这在我的测试中(select into vs.insert into(即使没有索引))起到了很大的作用。有没有一种方法可以像使用select into一样高效地复制数据而不删除表?与其删除原始表,不如重命名表。将所有数据加载到SomeSchema.TradesTaging后,添加所有约束和索引,然后将SomeSchema.Trades重命名为SomeSchema.Trades_YYMMDD,并将SomeSchema.TradesTaging重命名为SomeSchema.Trades。另一种方法是根据使用表分区和滑动窗口
SomeSchema.StageTradesFromFile
SomeSchema.LoadTradesFromStaging