gpt4 book ai didi

sql - 在 native SQL 中批量提交大型 INSERT 操作?

转载 作者:行者123 更新时间:2023-12-02 14:46:18 25 4
gpt4 key购买 nike

我有几个大表(188m 和 144m 行),需要从 View 填充,但每个 View 包含几亿行(将伪维度建模数据汇总成平面形式)。每个表上的键是超过 50 个复合字节的列。如果数据在表中,我总是可以考虑使用 sp_rename 来创建另一个新表,但这并不是真正的选择。

如果我执行单个 INSERT 操作,该过程会使用大量事务日志空间,通常会将其归档并给 DBA 带来很多麻烦。 (是的,这可能是 DBA 应该处理/设计/架构师的工作)

我可以使用 SSIS 并通过批量提交将数据流式传输到目标表(但这确实需要通过网络传输数据,因为我们不允许在服务器上运行 SSIS 包)。

除了使用某种键将进程划分为多个 INSERT 操作以将行分配到不同的批处理并执行循环之外,还有其他方法吗?

最佳答案

View 是否有任何类型的唯一标识符/候选键?如果是这样,您可以使用以下方法将这些行选择到工作表中:

SELECT key_columns INTO dbo.temp FROM dbo.HugeView;

(如果有意义,也许可以将此表放入不同的数据库中,也许使用简单恢复模型,以防止日志事件干扰您的主数据库。无论如何,这应该生成更少的日志,并且您可以释放恢复之前请先检查其他数据库的空间,以防问题是磁盘空间不足。)

然后你可以这样做,一次插入 10,000 行,并在其间备份日志:

SET NOCOUNT ON;

DECLARE
@batchsize INT,
@ctr INT,
@rc INT;

SELECT
@batchsize = 10000,
@ctr = 0;

WHILE 1 = 1
BEGIN
WITH x AS
(
SELECT key_column, rn = ROW_NUMBER() OVER (ORDER BY key_column)
FROM dbo.temp
)
INSERT dbo.PrimaryTable(a, b, c, etc.)
SELECT v.a, v.b, v.c, etc.
FROM x
INNER JOIN dbo.HugeView AS v
ON v.key_column = x.key_column
WHERE x.rn > @batchsize * @ctr
AND x.rn <= @batchsize * (@ctr + 1);

IF @@ROWCOUNT = 0
BREAK;

BACKUP LOG PrimaryDB TO DISK = 'C:\db.bak' WITH INIT;

SET @ctr = @ctr + 1;
END

这都是我的想法,所以不要剪切/粘贴/运行,但我认为总体思路就在那里。有关更多详细信息(以及为什么我在循环内备份日志/检查点),请参阅 sqlperformance.com 上的这篇文章:

请注意,如果您定期进行数据库和日志备份,您可能需要进行完整备份以重新开始日志链。

关于sql - 在 native SQL 中批量提交大型 INSERT 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1602244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com