オンプレミスSQL ServerからAWS移行後にDisk I/O性能が低下する原因と対策
公開日 2026-09-07 · 更新日 2026-09-07 · 最終検証日 2026-09-07
結論
オンプレミスの物理サーバーはPCIeバス直結のローカルNVMe/SSDを使うため極めて低いレイテンシと高いI/O処理能力を持ちますが、AWSのRDS/EC2で標準的なAmazon EBSはネットワーク経由でアタッチされる仮想ブロックストレージで、インスタンスサイズとボリューム種別に応じてIOPSとスループットが厳格にスロットリングされます。この違いを理解せずに移行すると、CPUに余裕があってもバッチやインデックス再構築がスロットリングで停滞し、Provisioned IOPSの過大な確保でコストだけが増える結果になります。対策はディスクI/Oの発生量そのものを減らすことが基本で、バッファプールの最大化、データ圧縮、データファイルとログファイルの物理分離、CDCクリーンアップ遅延によるログ肥大化への対処が実務上の中心になります。
この文書の適用条件
| 対象製品 | SQL Server(Amazon RDS for SQL Server / EC2上のSQL Server) |
|---|---|
| 確認バージョン | SQL Server 2012 以降(CDCの対応エディションは版により異なるため要確認) |
| 適用環境 | オンプレミス物理サーバーからのAWS移行(Amazon RDS for SQL Server、EC2) |
| 必要権限 | 確認系はVIEW DATABASE STATE相当の参照権限。sys.sp_cdc_cleanup_jobの手動実行とDBCC SHRINKFILEの実行にはdb_owner(環境によりsysadmin) |
| 実行影響 | 確認系コマンドは参照のみ。sp_cdc_cleanup_jobはCDC変更データの削除、DBCC SHRINKFILEはログファイルサイズの変更を伴う |
| 再起動 | 不要 |
| 最終検証日 | 2026-09-07 |
そのまま実行できるコマンド
- 対象
- SQL Server 2008 以降 / Amazon RDS for SQL Server
- 権限
- 対象テーブルへの参照権限(sp_estimate_data_compression_savings の実行権限)
- 変更作業
- なし(見積もりのみ、実際の圧縮は行わない)
- Production実行
- 可能
-- 対象: SQL Server 2008 以降 / Amazon RDS for SQL Server
-- 権限: 対象テーブルへの参照権限(sp_estimate_data_compression_savings の実行権限)
-- 変更作業: なし(見積もりのみ、実際の圧縮は行わない)
-- Production 実行: 可能
USE [SampleDB];
GO
EXEC sys.sp_estimate_data_compression_savings
@schema_name = 'dbo',
@object_name = 'Orders',
@index_id = NULL,
@partition_number = NULL,
@data_compression = 'PAGE';見積もり結果の size_with_current_compression_setting と size_with_requested_compression_setting の差が、圧縮によって削減できるディスク使用量の目安です。圧縮はCPUオーバーヘッドと引き換えにディスクI/O回数を減らすため、CPUに余裕がある環境ほど効果が出やすくなります。
- 対象
- SQL Server 2008 以降 / Amazon RDS for SQL Server
- 権限
- sys.databases のメタデータ可視性
- 変更作業
- なし(参照のみ)
- Production実行
- 可能
-- 対象: SQL Server 2008 以降 / Amazon RDS for SQL Server
-- 権限: sys.databases のメタデータ可視性
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT name, log_reuse_wait_desc
FROM sys.databases
WHERE name = 'SampleDB';
-- 結果が 'REPLICATION' の場合、CDC またはトランザクションレプリケーションが未読ログを保持している`REPLICATION` はCDCとトランザクションレプリケーションの両方が該当しうる値です。対象データベースでCDCが有効かどうかは別途 `sys.databases.is_cdc_enabled` で確認し、キャプチャの遅延そのものを詳しく追う場合は「SQL ServerのCDCでログスキャンが止まっていないか確認する方法」を参照してください。
- 対象
- SQL Server 2008 以降(CDC 対応エディション) / Amazon RDS for SQL Server
- 権限
- db_owner(cdc.sp_cdc_cleanup_job の実行権限)
- 変更作業
- あり(保持期間を超えたCDC変更テーブルのデータを削除)
- Production実行
- 実行可能。ただし削除対象データを下流の連携がまだ消費していないかを事前に確認する
-- 対象: SQL Server 2008 以降(CDC 対応エディション) / Amazon RDS for SQL Server
-- 権限: db_owner(cdc.sp_cdc_cleanup_job の実行権限)
-- 変更作業: あり(保持期間を超えたCDC変更テーブルのデータを削除)
-- Production 実行: 実行可能。ただし削除対象データを下流の連携がまだ消費していないかを事前に確認する
USE [SampleDB];
GO
EXEC sys.sp_cdc_cleanup_job;定期ジョブのクリーンアップが遅延している場合の即効的な対処です。ただしこれは症状への対処であり、クリーンアップジョブ自体がなぜ遅延したのか(ジョブの停止、実行時間の不足など)は別途調査してください。実行前にレプリケーション先やETLなど下流の連携が保持期間内の変更データをまだ読み取っていないかを必ず確認します。
- 対象
- SQL Server 2008 以降 / Amazon RDS for SQL Server
- 権限
- sysadmin または db_owner
- 変更作業
- あり(ログファイルの末尾を切り捨ててファイルサイズを縮小)
- Production実行
- 原則実行可能。ただし log_reuse_wait_desc が NOTHING であることを確認してから
-- 対象: SQL Server 2008 以降 / Amazon RDS for SQL Server
-- 権限: sysadmin または db_owner
-- 変更作業: あり(ログファイルの末尾を切り捨ててファイルサイズを縮小)
-- Production 実行: 原則実行可能。ただし log_reuse_wait_desc が NOTHING であることを確認してから
USE [SampleDB];
GO
-- 目標サイズ(MB)を指定して縮小する
DBCC SHRINKFILE (N'SampleDB_log', 1024);log_reuse_wait_desc の要因を解消する前に縮小しても、ログはすぐに再拡張します。本ナレッジベースではSHRINK系の操作を影響の大小にかかわらずすべて「高」表示にしています。データファイルの縮小とログファイルの縮小の違い、TRUNCATEONLYの使い分けは「DBCC SHRINKDATABASEとDBCC SHRINKFILEの違いと実行前に確認すること」で詳しく扱っています。
結果の読み方
| 列 | 意味 | 確認するポイント |
|---|---|---|
| log_reuse_wait_desc | トランザクションログの領域が解放されない理由 | 'REPLICATION' はCDCまたはトランザクションレプリケーションが未読ログを保持していることを示す。'NOTHING' なら解放を妨げる要因はない |
| size_with_requested_compression_setting | 指定した圧縮方式を適用した場合の推定サイズ | 現在のサイズとの差が大きいほど、ディスクI/O削減とストレージ費用削減の余地が大きい |
こういう状況で使います
- オンプレミス移行前と同等以上のスペックのAWSインスタンスを選んだのに、夜間バッチやインデックス再構築の所要時間が2倍以上に伸びた
- 大規模なデータロードやインデックス再構築の途中でデータベース全体が一時的に応答しなくなる
- CPU使用率には余裕があるのに、バッチ処理だけが終わらない
- 移行後しばらくしてストレージ容量が急激に逼迫し、RDSの自動ストレージスケーリングが頻発する
- Provisioned IOPS(io2など)を増強してもストレージ費用ばかり増え、根本的な改善に至らない
考えられる原因(可能性の高い順)
01
ネットワーク接続型ストレージ(EBS)特有のレイテンシ
オンプレミスの物理NVMe/SSDはPCIeバスに直結されマイクロ秒単位のレイテンシで動作しますが、AWSのRDS/EC2で標準的なAmazon EBSはインスタンスと専用の内部ネットワークリンクで接続される仮想ブロックストレージです。物理的な遅延(数ミリ秒単位)が構造上必ず発生します。
02
IOPSとスループットのスロットリング(帯域制限)
インスタンスサイズおよびボリュームの種類・割り当て容量に応じて、1秒間に処理できるIOPSとスループット(MB/s)の上限が厳格に定義されています。gp2/gp3などの汎用ボリュームはベースライン性能を超えるとバースト残量を消費し、大規模なデータロードやインデックス再構築で上限に達すると激しいスロットリングが発生してDB全体が応答不能になります。ボリューム側のIOPSをio2等で引き上げても、インスタンス側のEBS専用帯域幅(EBS-Optimized)がボトルネックになる場合もあります。
03
Provisioned IOPSの過大設定によるコスト肥大化
I/O性能不足を安易に解決しようとして高額なio2/io2 Block Expressなどのプロビジョンド IOPSを大量に確保すると、ストレージ費用だけで月数十万〜数百万円規模に跳ね上がり、クラウド移行によるコスト削減効果が失われます。
04
CDCクリーンアップジョブの遅延によるログ未解放
大量のバッチ更新が発生した際にCDCのクリーンアップジョブが追いつかなくなると、トランザクションログが「CDCによってまだ読み取られていない」とマークされ、CHECKPOINTやログバックアップを実行してもログ領域が解放されなくなります。ログファイルが自動拡張を続け、ストレージ容量を枯渇させてRDSの自動ストレージスケーリングを強制発動させます。
確認手順
- 1
既存テーブルの圧縮削減効果を見積もる
参照のみ`sys.sp_estimate_data_compression_savings` で、ディスクI/O削減とストレージ費用削減の余地がどれだけあるかを確認します。
- 2
log_reuse_wait_desc でログ未解放の要因を特定する
参照のみ`sys.databases.log_reuse_wait_desc` が `REPLICATION` で固定されていないかを確認します。固定されている場合はCDCまたはトランザクションレプリケーションの遅延が疑われます。
- 3
CDCが有効かどうかとキャプチャの遅延を確認する
参照のみ`sys.databases.is_cdc_enabled` でCDCの有効化状況を確認し、有効な場合は `sys.dm_cdc_log_scan_sessions` でキャプチャの遅延を確認します(詳細は関連記事を参照)。
- 4
EBSボリュームとインスタンスのIOPS/スループット契約値を確認する
参照のみボリュームタイプ(gp3/io2等)のプロビジョンドIOPS・スループットと、インスタンス側のEBS帯域幅上限をAWSコンソールまたはCLIで確認します。
- 5
手動でCDCクリーンアップを実行する
中下流の連携が保持期間内のデータを消費済みであることを確認したうえで `sys.sp_cdc_cleanup_job` を実行し、ログの解放可能状態を復元します。
- 6
ログファイルを縮小する
高`log_reuse_wait_desc` が `NOTHING` になったことを確認してから `DBCC SHRINKFILE` でログファイルを目標サイズまで縮小します。
対応方法
すぐに実施できる低リスクの対応
バッファプールを最大化しディスク読み取りを減らす
低ストレージのIOPSを有料で引き上げる前に、インスタンスサイズをスケールアップしてRAM容量を増やし、SQL Serverのバッファプールサイズを極大化します。よく参照されるアクティブデータがメモリ上にキャッシュされる状態を維持できれば、EBSのI/Oボトルネックを大きく緩和できます。
手動でCDCクリーンアップを実行し未解放ログを解消する
中定期ジョブを待たずに `sys.sp_cdc_cleanup_job` を実行し、ログの解放可能状態を復元します。実行前に下流の連携がデータを消費済みであることを確認します。
事前検討が必要な変更
データファイルとログファイルを別のEBSボリュームに分離する
中データファイル(ランダムI/Oが中心)とトランザクションログ(シーケンシャルライトが中心)を同一のEBSボリュームに混在させるとI/Oキューの競合が発生します。必ず別のEBSボリュームに分離して配置します。
PAGE/ROW圧縮を適用してI/O発生量を削減する
中CPUリソースに余裕がある場合、データ圧縮でディスクから読み取るブロックサイズとログへの書き込みサイズを削減します。事前に `sp_estimate_data_compression_savings` で効果を見積もってから適用します。
リードレプリカで参照負荷をオフロードする
中レポーティングクエリやバッチ参照処理がマスターDBのI/O帯域を圧迫している場合、参照専用のリードレプリカを構築してトラフィックを分散します。
CDCクリーンアップジョブの遅延を監視対象に加える
低クリーンアップジョブの実行成否と所要時間を監視し、遅延が常態化する前に検知できるようにします。
再起動・サービス影響を伴う変更
ログファイルをDBCC SHRINKFILEで縮小する
高log_reuse_wait_desc が NOTHING であることを確認してから実施します。要因を解消せずに縮小しても直後に再拡張します。実行中はI/Oを消費し、対象への書き込みが遅くなります。
専門家のレビューが必要な作業
Provisioned IOPS(io2等)の要否をワークロード全体で再設計する
専門家レビュー必須バッファプール最大化・データ圧縮・ファイル分離を実施してもなお不足する場合に限り検討します。安易な引き上げは月額コストを大きく押し上げるため、ワークロード全体のI/Oパターンを分析したうえで専門的なレビューを経てください。
!注意事項
- DBCC SHRINKFILEの実行は log_reuse_wait_desc が NOTHING であることを確認してから行ってください。要因が残っている状態で縮小しても、すぐに再拡張します。
- sys.sp_cdc_cleanup_job で保持期間を超えたCDC変更データを削除する前に、下流の連携(レプリケーション先やETL)がその期間のデータをまだ消費していないかを確認してください。
- Provisioned IOPS(io2等)を安易に増強する前に、まずバッファプールの最大化とデータ圧縮でディスクI/Oの発生量そのものを減らせないかを検討してください。
- 本記事の圧縮率やコスト削減額の目安はワークロードとデータ内容に依存し、すべての環境で同じ効果になるとは限りません。
これで解決しない場合に確認すること
EBSボリュームのIOPS/スループットのバーストが枯渇していないか確認したか
gp2/gp3のバースト残量を消費し尽くしていないかをCloudWatchメトリクスで確認します。
インスタンス側のEBS帯域幅(EBS-Optimized)がボトルネックになっていないか確認したか
ボリューム側のIOPSを引き上げても、インスタンスのEBS専用帯域幅の上限に達していれば期待した性能は出ません。
CDCクリーンアップジョブの実行履歴とエラーを確認したか
クリーンアップジョブが定期的に成功しているか、失敗やスキップが続いていないかをジョブ履歴から確認します。
AWS Direct Connectの要否を含むネットワーク遅延を計測したか
オンプレミスの残存アプリケーションとAWS上のDB間の通信遅延が別のボトルネックになっていないかを確認します。
この文書の根拠と限界
実運用で確認した内容
本記事はAmazon EBSのIOPS/スループット仕様、SQL ServerのCDC・DBCC SHRINKFILEの公開仕様、および複数の類似移行案件で共通して観測される傾向を一般化した記述です。圧縮率やコスト削減額の具体的な数値は環境依存の目安であり、特定顧客の事例や内部Issue番号は含みません。
よくある質問
AWS移行後にDisk I/Oが遅くなるのはインスタンスサイズの選定ミスですか?
必ずしもそうとは限りません。オンプレミスの物理NVMe/SSDとAWSのネットワーク接続型ストレージ(EBS)は構造そのものが異なり、同等スペックのインスタンスを選んでもIOPS・スループットのスロットリングによって性能上限が生まれます。まずはこの構造的な違いを踏まえた設計(バッファプール最大化、ファイル分離、圧縮)を検討してください。
Provisioned IOPS(io2等)を増やせば解決しますか?
解決する場合もありますが、コストが急激に膨らみやすい対処です。先にバッファプールの最大化でディスク読み取りそのものを減らし、データ圧縮でI/O発生量を削減したうえで、それでも不足する場合に限って検討することを推奨します。
CDCを使っていないのにログファイルが肥大化する場合も同じ対処で良いですか?
`log_reuse_wait_desc` が `REPLICATION` になる原因はCDCとトランザクションレプリケーションの両方があり得ます。まず `sys.databases.is_cdc_enabled` でCDCの有効・無効を確認し、CDCを使用していない場合はトランザクションレプリケーションの構成、または一般的なログファイル使用率の確認手順を参照してください。
DBCC SHRINKFILEはいつ実行してよいですか?
`log_reuse_wait_desc` が `NOTHING` になったことを確認してからです。CDCのクリーンアップ遅延が原因の場合は、先に `sys.sp_cdc_cleanup_job` を実行してログを解放可能な状態にしてください。データファイルの縮小とログファイルの縮小では影響が異なるため、実施前に関連記事も確認してください。
この文書がカバーする質問
- オンプレミスSQL ServerをAWSに移行したら遅くなった原因を知りたい
- AWS移行後のストレージコストが急増する理由が知りたい
- CDCが原因でログファイルが増え続ける場合の対処法を知りたい
リスク表示の意味
- 参照のみデータと設定を変更しません。
- 低影響は限定的ですが、権限と負荷の確認が必要です。
- 中性能・ロック・コストに影響する可能性があります。
- 高障害・データ損失・復旧作業が発生する可能性があります。
- 専門家レビュー必須本番適用前に別途レビューが必須です。
GIIPの対応範囲
「Disk I/O 90%超過」のようなリソース閾値のアラートだけでは、どのクエリや処理が原因でI/Oを圧迫しているのか、月あたり実際にいくらの無駄なコストを生んでいるのかは分かりません。GIIPではストレージI/O・IOPS消費量・CDCクリーンアップジョブの実行状況・ログファイルの増減を同じ時系列で保持し、原因をコスト($)ベースで特定できるようにしています。Provisioned IOPSの増強のような不可逆かつ高コストな判断は、実行前のSQLとロールバック手順を明示したうえで実施可否を人間が確認する運用としています。
執筆・技術検証
GIIP プロダクション運用チーム
大規模Webサービス、SQL Server、Oracle、AWS、Azureの設計・移行・運用に約30年従事。x12largeクラスのAWS RDS for SQL Server環境12セット、約12万テーブルのOracle環境、約3TBのTiDBからAurora MySQLへの移行を経験。現在も複数のクラウドデータベースと約30のWebサービスを、AIエージェントと人間の専門家が継続的に監視・運用しています。
SQL ServerのCDCでログスキャンが止まっていないか確認する方法
sys.dm_cdc_log_scan_sessions と cdc.lsn_time_mapping、キャプチャジョブの状態から、CDCのログスキャンが進んでいるかを確認する手順です。
sql-serverDBCC SHRINKDATABASEとDBCC SHRINKFILEの違いと実行前に確認すること
データベース全体を対象にする SHRINKDATABASE と、ファイル単位の SHRINKFILE の違い、TRUNCATEONLY の使いどころ、実行前に確認すべき項目を整理します。
sql-serverRDS for SQL Serverでトランザクションログの使用率を確認する方法
ログ使用率を DBCC SQLPERF(LOGSPACE) と sys.dm_db_log_space_usage で確認し、解放されない理由を log_reuse_wait_desc で切り分ける参照専用手順です。
infrastructureAWS EBSのIOPSと物理ディスクのIOPSは何が違うのか
EBSのIOPSがなぜ物理ディスクのIOPSと直接比較できないのかを、上限の適用箇所(ボリューム/インスタンス)と測定方法から整理した文書です。
関連サービス
AWS移行後のディスクI/O性能を診断する
同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。
AWS移行後のディスクI/O性能を診断する