ディスク領域はシリンダに分割されます。各シリンダは複数のデータ ブロックで構成され、各データ ブロックには1行以上のデータが保持されます。データベースは以下のようにシリンダを割り当てます。
使用 | 説明 |
---|---|
シリンダ上の連続セクター | データ ブロックは、1つのシリンダ内の隣接するセクターに保管されます。 1つのシリンダで20個のセクターが使用可能であっても、そのうち10個しか連続していなければ、15セクターから成るブロックは別のシリンダに保管しなければなりません。 |
空きシリンダ | 複数のシリンダにまたがって永続データを分散すれば、Vantageの性能は向上します。しかし永続データとスプール データが同じシリンダを共用することはできません。 したがって、スプール領域用に使える空きシリンダが常にシステム上になければなりません。 |
Vantageでは、すべてのシリンダが割り振られて完全に使い果たされてしまわない限り、ディスク領域が不足することはありません。
低シリンダ使用率
しかし、空いているシリンダが残り少なくなると、すぐに性能の低下が起こります。これは、未使用のディスク領域を再利用するために、使用率の低いシリンダに対してシステムがMiniCylPacksを実行することが原因です。このため、使用率の低いシリンダ数が多いことが領域不足の原因かどうかを確認する必要があります。
- 小さい値のFreeSpacePercent(FSP)を使ってテーブルのFastLoadを実行し、その後さらにそのFSPよりも大きいテーブルにデータを挿入した場合。
- テーブルの大部分を削除したけれども、領域を再利用するためのFerret PACKDISKをまだ実行していない場合。
頻繁に更新されるテーブル
頻繁に更新されるテーブルがあると、シリンダ上の空き領域が断片化され過ぎて使用できなくなることがあります。
そのような事態になると、システムがテーブルに追加のシリンダを割り振る可能性があります。このような問題が起きないようにするため、システムはシリンダの断片化解消を行なって、シリンダの空き領域を再び使用できるようにすることがあります。
AutoCylPack
AutoCylPack (自動バックグランド シリンダ パッキング)はシリンダ上の領域を管理し、使用状況が高いまたは低いシリンダを見つけ、ユーザー定義FSP (Free Space Percent)つまりAutoCylPackが将来のテーブルの増大を考慮してデータの空きを残した、シリンダ内のストレージ領域の割合にまで戻します。
AutoCylPackのシステム全体のデフォルト値があります。CREATE TABLEやALTER TABLE文でFSP句を指定することにより、テーブル単位でオーバーライドできます。
ファイル システムで、十分な空きシリンダを維持し、シリンダの領域を管理することが重要です。
AutoCylPackは、I/Oを発行するバックグラウンド タスクとして動作しますが、影響レベルを調整できます。AutoCylpackをサポートするDBS制御フィールドについては、<Teradata Vantage™ - データベース ユーティリティ、B035-1102>を参照してください。
性能
- MiniCylPackが動作する機会。MiniCylPackはシリンダ全体の再利用に厳密に関係します。
- ユーザーが通常のFerret PACKDISK処理を実行することが必要になる状況。
PACKDISKをテーブル上で実行できます。一定範囲のテーブルやシステム全体、フォアグラウンド タスクの性能、したがってシステム性能に影響があります。
- システム性能は向上します。これはシリンダ インデックス率が高いデータ ブロックがあり、シリンダ読み取りがさらに効果的に実行されるためです。読み取る、占有されていないセクターが減ります。
- テーブルが少数のシリンダを占有します。これにより他に使用できるシリンダが増えます。
MiniCylPack
MiniCylPackは、論理シーケンス中のデータ ブロックをシリンダからシリンダに移動し、使用可能な空きシリンダの必要数が確保された時点で、処理が停止されます。1回のMiniCylPackで、AMP上の2~20個のシリンダが処理されます。
1つのシリンダが完全に空になるまでこのプロセスは続けられます。マスター インデックスは、前回MiniCylPackが完了した地点から、次に必要なMiniCylPackを開始します。
ファイル システムは、空きシリンダ数がMiniCylPackLowCylProdで設定されている値を下回った場合に、MiniCylPackを開始します。デフォルト値は10です。
ファイル情報ブロック(FIB)は、最後に割り振られた5つのシリンダの履歴を保存することにより、これらに対するMiniCylPackの実行を回避します。
MiniCylPackを起動する空きシリンダしきい値を指定するためには、DBS制御(<Teradata Vantage™ - データベース ユーティリティ、B035-1102>の「MiniCylPackLowCylProd」を参照)を使用します。システムで空きシリンダが必要になり、その際に空きシリンダがない場合には、自動的にMiniCylPackが実行されます。
データ ブロックの移行
- 直前または直後のシリンダにブロックを移行して領域を使用可能にすることができる場合は、移動する必要のあるブロック数が少ないほうの方向を選びます。
ブロック数が同じ場合は、空きセクター数の多いほうのシリンダへの方向を選びます。
- 手順1で目的のセクターが空かなかった場合、別の方向へのブロックの移行を試します。
- 新規のシリンダを割り振らないと領域を設けられない場合は、新規のシリンダを割り振ります。新規のシリンダを追加する望ましい位置は次のとおりです。
- 永久テーブルの場合は、現在のシリンダの前。
- スプール テーブルの場合とFastLoadの実行中は、現在のシリンダの後。
順方向または逆方向のどちらへ移行するかで、ブロック数が異なることがあります。システムによって移行対象とみなされるブロックが異なる可能性があるからです。
シリンダ内のキー範囲に対する制約により、逆方向への移行では、システムは最小のキーを持つテーブルと行の順に移行する必要があります。順方向への移行では、最大キーをもつテーブルと行の順に移行されなければなりません。
ソートや復元などの特別用途にも対応できるよう、シリンダからシリンダへのブロックの移行に対してはシステムは特別ルールに従っています。これらの特別なルールは、多少変則的に運用される場合もあります。例えば、追加の必要があると予測した以上のデータ ブロックの移動や、移行するデータ ブロック数を決めるためのシリンダでのサブテーブルの中断の検出などがこれに該当します。
性能
シリンダのパッキング自体が性能に与える影響はわずかですが、多くの場合、性能に影響を与える条件やイベントが付随します。ファイル システムがMiniCylPackを実行すると、その操作によって正確に1つのシリンダが解放されます。
シリンダ パック操作そのものは、空きシリンダを必要とするジョブを所有するユーザーの優先順位どおりに実行します。シリンダ パッキング操作は、書き込み操作の実行のための領域を回復するためにシステムが実行できる最後の手順であり、システムで領域が不足しているということを示します。
スプール使用量の非常に高い問合わせまたは問合わせグループが、使用可能な空き領域を使い果たすような場合にも、一時的な措置としてcylpackが必要になることもあります。これは、望ましい状況とはいえません。
- AutoCylPack を有効にし(まだ有効にしていない場合)、CREATE TABLE やALTER TABLE 文を使用して読み取り専用テーブルでFSP に0% を指定する。
- Ferret PACKDISKコマンドを実行する。
エラー コード
MiniCylPackは自動的に実行され、システムの領域が不足しかけていることを知らせる警告として機能します。密にデータを詰め込むと、いずれシリンダの割り振りが必要になり、MiniCylPackが何度も起動されることになります。
MiniCylPackは、次のようなエラー コード付きでSoftware_Event_LogVに記録されます。
コード | 説明 |
---|---|
340514100 | DBS制御に設定されているしきい値で実行されたMiniCylPackのサマリー。 |
340514200 | 処理中にMiniCylPackが発生し、タスクがその完了を待機していた。 |
340514300 | システムはMiniCylPackでシリンダを解放できなかった。MiniCylPackは失敗しました。これは、システムが満杯になりつつあるか、またはシリンダのしきい値が不当に高く設定されすぎていることを意味します。このエラー コードは直ちに調査が必要です。 |
340514200または340514300メッセージが何度も出る場合、たいていはすべてのAMPにおけるスプール ファイルの所要量が大きいために構成上の問題が起きていることを示します。スプール所要量を下げない限り、すべてのAMPでMiniCylPackが実行されることになります。そのような場合、実行中のすべてのリクエストが影響を受けます。
テーブル データにスキューがあると、Vantageがディスク領域の大半を使い果たしているわけではなくても、MiniCylPackが起きることがあります。
断片化解消
ランダムな更新が繰り返し生じると、シリンダ上のデータ ブロック間に空きギャップが散在するようになります。これを断片化と呼びます。シリンダが断片化すると、将来の更新用の合計空き領域は十分であっても、シリンダには特定のデータ ブロックを保管するのに十分な連続セクターがなくなる可能性があります。そのため、シリンダが移行されることになり、さらに、新規のシリンダが足りなければ新規シリンダの割り振りが行なわれることさえあります。この問題に対処するためファイル システムは、断片化シリンダの断片化を解除し、すべての空き領域を集めて連続セクターにまとめます。
断片化解消を引き起こす空きシリンダしきい値を指定するには、DBS制御(<Teradata Vantage™ - データベース ユーティリティ、B035-1102>の「DefragLowCylProd」を参照)を使用します。その空きシリンダしきい値にシステムが達したら、バックグラウンド タスクとしてシリンダの断片化解消が行なわれます。
ファイル システムは、シリンダの断片化を解除するのに新規のシリンダを割り振り、断片化シリンダのデータをその新規のシリンダにコピーします。古いシリンダは最終的に解放され、断片化解消シリンダになりますが、使用可能な空きシリンダ数は変わりません。
コピーは順番どおりに行なわれるので、新規のシリンダは、シリンダ上のすべての空きセクターを記述した1つの空きセクター エントリを備えることになります。このシリンダに対する新規セクター リクエストは、前には失敗していたかもしれませんが、今度は正常に完了します。
Ferret断片化解消
Ferret Defragコマンドが断片化解消コマンドです。ユーザー シリンダの全セットをスキャンし、条件を満たすシリンダの断片化を解消するために使用できます。
ただし、Ferret Defragコマンドを実行すると、稼動状況の高い顧客システムでは、フォアグラウンド タスクの性能、したがってシステム性能に影響します。さらに、Ferret Defragには、システムですでに利用可能な、十分な空きシリンダがある、つまり断片化解消が必要ないかどうかを認識する方法がありません。
性能の低下
AutoCylPacks、MiniCylPacksと断片化解消は、システムが今後の使用に備えて空きディスク領域を確保するという意味では有効ですが、性能の低下につながります。そのようなオーバーヘッドが生じないようにするには、システムを適切にサイズ設定して調整してください。