一括インポートで最小ログ記録を行うための前提条件
一括ログ復旧モデルまたは単純復旧モデルでは、一括インポート操作時に最小限のログだけを記録できます。完全復旧モデルのデータベースの場合、一括インポート中に実行されるすべての行挿入操作が、トランザクション ログに完全に記録されます。完全復旧モデルを使用する場合、大きなデータをインポートするとトランザクション ログがすぐにいっぱいになってしまいます。対照的に、最小ログ記録を行うと、一括インポート操作によってログ領域がいっぱいになる可能性が少なくなります。最小ログ記録は完全ログ記録よりも効率的です。最小ログ記録を行うには、データベースが一括ログ復旧モデル (データベースの完全復旧が通常行われる場合) か単純復旧モデルである必要があります。
メモ : |
---|
完全復旧モデルと一括ログ復旧モデルの切り替えの詳細については、「完全復旧モデルまたは一括ログ復旧モデルからの切り替えに関する注意点」を参照してください。 |
最小ログ記録のためのテーブルの要件
最小ログ記録を行うテーブルは、次の条件をすべて満たしている必要があります。
- テーブルがレプリケート中でないこと。
- (TABLOCK を使用して) テーブル ロックが指定されていること。
詳細については、「一括インポートのロック動作の制御」を参照してください。
メモ : |
---|
最小限のログ記録しか行われない一括インポート操作では、データを挿入してもトランザクション ログに記録されませんが、新しいエクステントがテーブルに割り当てられるたびに、データベース エンジンによりエクステントの割り当てがログに記録されます。 |
テーブルのインデックス
次に示すとおり、あるテーブルの最小ログ記録を行うことができるかどうかは、そのテーブルにインデックスがあるかどうか、また、インデックスが存在する場合はテーブルが空かどうかによっても異なります。
- テーブルにインデックスがない場合、データ ページの最小ログ記録が行われます。
- テーブルにクラスタ化インデックスがなく、非クラスタ化インデックスが 1 つ以上ある場合、データ ページは常に最小ログ記録が行われます。次に示すとおり、インデックス ページのログがどのように記録されるかは、テーブルが空かどうかにより異なります。
- テーブルが空の場合、インデックス ページは最小ログ記録が行われます。
- テーブルが空ではない場合、インデックス ページは完全ログ記録が行われます。
メモ : 空のテーブルに複数のバッチのデータを一括インポートする場合、最初のバッチについてはインデックス ページとデータ ページの最小ログ記録が行われますが、2 番目以降のバッチはデータ ページのみの最小ログ記録が行われます。 - テーブルが空で、クラスタ化インデックスがある場合、データ ページとインデックス ページの最小ログ記録が行われます。
対照的に、空ではないテーブルにクラスタ化インデックスがある場合、データ ページとインデックス ページはどの復旧モデルであっても完全ログ記録が行われます。メモ : 空のテーブルに複数のバッチのデータを一括インポートする場合、最初のバッチについてはインデックス ページとデータ ページの最小ログ記録が行われますが、2 番目以降のバッチはデータ ページのみ一括ログ記録が行われます。
一括インポート時のテーブル ロックやログ記録の動作の概要などの詳細については、「一括インポートのパフォーマンスの最適化」を参照してください。
ベスト プラクティス 一括ログ復旧モデルを使用してテーブル行の大きなセットをインポートするときは、一括インポートを複数のバッチに分散させることを検討してください。それぞれのバッチは、1 つのトランザクションと見なされます。したがって、バッチが完了した時点でそのバッチのログをバックアップできます。そのテーブル行の一括インポートに使用したログ領域が、次回のログ バックアップにより再利用されます。
参照
概念
その他の技術情報
bcp ユーティリティ
BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
BACKUP (Transact-SQL)
ALTER DATABASE (Transact-SQL)
SuspendIndexing Property
UseBulkCopyOption Property