视图是否有任何类型的唯一标识符/候选键?如果是这样,您可以使用以下方法将这些行选择到工作表中:
SELECT key_columns INTO dbo.temp FROM dbo.HugeView;
(如果有意义,可以将此表放入不同的数据库,可能使用 SIMPLE 恢复模式,以防止日志活动干扰您的主数据库。无论如何,这应该生成更少的日志,并且您可以释放空间恢复之前的其他数据库,以防问题是您周围的磁盘空间不足。)
然后你可以做这样的事情,一次插入 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上的这篇文章:
请注意,如果您正在执行常规数据库和日志备份,您可能需要完整备份以重新启动您的日志链。