ビューには、一意の識別子/候補キーの種類がありますか? その場合、次を使用してそれらの行を作業テーブルに選択できます。
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 の次の投稿を参照してください。
データベースとログのバックアップを定期的に行っている場合は、ログ チェーンを最初からやり直すために、おそらく完全なバックアップを取得する必要があることに注意してください。