基本情報技術者 2013年 春期 午前(科目A) 問17
問題文
アプリケーションの変更をしていないにもかかわらず、サーバのデータベース応答性能が悪化してきたので、表のような想定原因と、特定するための調査項目を検討した。調査項目cとして、適切なものはどれか。

選択肢
ア:遅い処理の特定
イ:外的要因の変化の確認
ウ:キャッシュメモリのヒット率の調査
エ:データの格納状況の確認(正解)
🔒 解説は解答すると表示されます
データ格納状況の確認【午前解説】
正解の理由
正解は エ(データの格納状況の確認)です。
フラグメンテーションによるディスクI/Oの増加は、データが物理的に分散していることが原因で発生します。したがって、ファイルシステム上のファイル断片(extent数)やデータベース内部のページ配置・インデックス断片化・空き領域状況を直接調べることが最も適切です。これにより、本当に物理配置が原因か、それともキャッシュ不足や外的要因など別原因かを切り分けられます。
フラグメンテーションによるディスクI/Oの増加は、データが物理的に分散していることが原因で発生します。したがって、ファイルシステム上のファイル断片(extent数)やデータベース内部のページ配置・インデックス断片化・空き領域状況を直接調べることが最も適切です。これにより、本当に物理配置が原因か、それともキャッシュ不足や外的要因など別原因かを切り分けられます。
解法ステップ
- 基本メトリクス収集:iostat、vmstat、sar、iotop等でI/O待ち(%iowait)、平均待ち時間、キュー長を確認。
- アクセスパターン把握:ランダム読み書きが増えているかを確認し、フラグメンテーションの可能性を評価。
- ファイルシステム側診断:filefrag(Linux)、fsutil(Windows)等でファイルのextent数や断片状態を確認。
- DB側診断:インデックス断片化、テーブルの空きページ比、ページ密度(fillfactor)、bloat(Postgresのpgstattuple)を測定。
- 切り分けと対処:物理配置が原因ならインデックス再構築、テーブル再編成、ファイルシステムのデフラグやデータ移動を検討。SSD環境では意味合いが変わるため注意。
(参考コマンド例)
# LinuxでのI/O概要
iostat -x 5 3
# ファイルの断片数確認(例)
filefrag -v /var/lib/mysql/ibdata1
# PostgreSQLでテーブル膨張確認(拡張が有効な場合)
# psql -c "SELECT * FROM pgstattuple('schema.table');"
選択肢別の誤答解説
- ア: 遅い処理の特定
解説:遅いSQLやスロークエリの特定は「非定型検索で処理時間が長い」原因(b)を調査する際に有効ですが、フラグメンテーションによる物理I/O増加を直接検出する手段ではありません。 - イ: 外的要因の変化の確認
解説:同一マシンに他システムを置いた、接続クライアント増加など外的要因(a)の確認は重要ですが、フラグメンテーション(c)そのものを示す調査項目にはなりません。 - ウ: キャッシュメモリのヒット率の調査
解説:キャッシュヒット率の低下はバッファ容量不足(d)やアクセスパターンの変化を示しますが、物理ファイルの断片化が原因かどうかを特定するには不十分です。 - エ: データの格納状況の確認
解説:物理的にファイルやデータページが細かく分散しているか(extent数、断片化、インデックスの空きページ)を直接検査できるため、フラグメンテーションによるI/O増加の原因特定に最も適しています。
よくある誤解
- キャッシュヒット率(バッファヒット)だけを見ればフラグメンテーションの有無がわかる:バッファヒットは重要ですが、物理配置の悪化はキャッシュ外アクセスを増やすため、別途格納状況の確認が必要です。
- ディスクI/Oが増えたらまずOSや他プロセスの確認だけで十分:外的要因確認は必要ですが、データ配置の問題はOS側からは見えにくくDB内部診断が不可欠です。
- インデックス再作成すれば必ず改善する:多くは効果がありますが、ファイルシステムの断片化やSSD/ストライピング配置など別要因が残る場合もあります。
補足コラム
フラグメンテーションには「ファイルシステム側の断片化」と「データベース内部の断片化(ページ/インデックスの空き領域)」があります。特に大規模なDELETE/INSERTや頻繁な更新でページ分裂(page split)が起きるとインデックス断片化が進行します。DBMSごとに診断/修復手順が異なり、SQL Serverでは sys.dm_db_index_physical_stats、PostgreSQLでは pgstattuple や auto-vacuum 設定、Oracleでは segment advisor や ALTER INDEX REBUILD 等を活用します。SSD環境ではシークペナルティは小さいもののランダム小粒I/Oの総量増加は性能に影響するため、依然として最適化の対象です。
FAQ
Q1:フラグメンテーションの判断に有効な指標は?
A1:ファイルのextent数、平均I/O待ち時間(await)、I/Oキュー長、ランダムRead/Write比率、インデックスの平均断片化率やページの空き率が有効です。
A1:ファイルのextent数、平均I/O待ち時間(await)、I/Oキュー長、ランダムRead/Write比率、インデックスの平均断片化率やページの空き率が有効です。
Q2:インデックス断片化の目安はありますか?
A2:DB製品ごとに目安は異なりますが、一般的な運用目安は断片化率が30%以上なら再構築、5〜30%なら再編成という方針がよく用いられます(製品マニュアルに従ってください)。
A2:DB製品ごとに目安は異なりますが、一般的な運用目安は断片化率が30%以上なら再構築、5〜30%なら再編成という方針がよく用いられます(製品マニュアルに従ってください)。
Q3:SSDならフラグメンテーションは無視してよいですか?
A3:SSDはシークコストが低いですが、小さなランダムI/Oの総量増加や内部ガーベジコレクションで影響を受けます。完全に無視するのは危険です。
A3:SSDはシークコストが低いですが、小さなランダムI/Oの総量増加や内部ガーベジコレクションで影響を受けます。完全に無視するのは危険です。
関連キーワード: ディスクフラグメンテーション、ディスクI/O、インデックス断片化、ファイル配置、パフォーマンス監視、iostat、filefrag、pgstattuple、インデックス再構築、ランダムI/O

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

