Oracle は非常に大規模なデータベースとして、金融、郵便、通信、電力、民間航空など、膨大なデータ スループットと広範なコンピュータ ネットワークを備えた主要組織で広く使用されています。システム管理者にとっては、ネットワークの安定した運用を確保し、データベースのパフォーマンスを向上させてネットワークの安全性と効率性を高めることが特に重要です。データベースのパフォーマンスに影響を与える主要な要因として、データベースの断片化は DBA の十分な注意を喚起する必要があり、断片のタイムリーな検出とクリーンアップは DBA の基本的なメンテナンス内容です。
1. 破片はなぜ発生するのですか?
データベースが生成されると、システム (System) テーブルスペース、一時 (Temporary) テーブルスペースなど、テーブルスペース (Tablespace) と呼ばれる複数の論理セグメント (Segments) に分割されます。表スペースには、複数のデータ範囲 (エクステント) と 1 つ以上のフリー・レンジ・ブロック、つまりフリー・スペース (フリー・スペース) を含めることができます。
表スペース、セグメント、カテゴリー、および空きスペース間の論理関係は次のとおりです。
表スペースにセグメントが作成されると、表スペースの有効な空きスペースからセグメントの初期スコープにスペースが割り当てられます。これらの初期範囲がデータで満たされると、セグメントは別の範囲の追加を要求します。この拡張プロセスは、最大範囲値に達するまで継続され、表スペースに次の範囲用の空きスペースがなくなる可能性があります。最も理想的な状況は、セグメントのデータを 1 つのカテゴリに保存できることです。この方法では、すべてのデータがセグメント内の他のデータの近くに格納されるため、データの検索に必要なポインターの数が少なくなります。ただし、セグメントに複数のフィールドが含まれる場合が多く、これらのフィールドが近くに保存されていることを証明する方法はありません。スペース要件を満たす必要がある場合、データベースは(他の方法がない場合を除き)隣接する空き範囲を閉じることはなくなり、使用する表スペース内の最大の空き範囲を探します。これにより、離散的で分離された小さな自由空間、つまり断片が徐々に形成されます。
2. 断片化によるシステムへの影響
時間が経つにつれて、データベース ベースのアプリケーション システムが広く使用されるようになると、より多くのフラグメントが生成され、データベースに次の 2 つの重要な影響を与えることになります。
1) システムパフォーマンスの低下を招く
一般に、スペース要件を満たす必要がある場合、データベースはまず現時点で最大の空き範囲を検索しますが、「最大」の空き範囲は徐々に小さくなり、十分な大きさの空き範囲を見つけることがますます困難になります。それは難しいため、表スペースの速度障害により、データベースのスペース割り当ては理想的な状態からますます遠ざかってしまいます。
2) 大量のテーブルスペースを広げる
一部の空き領域 (テーブルスペースの増加率がゼロでないなど) は、SMON (システム監視) バックグラウンドボスプロセスによって定期的にマージされますが、自動的に閉じることができない空き領域が常に存在し、大量のテーブルが無駄になります。空間。 。
3. フリーカテゴリのフラグメント計算
空き領域の断片化は、カテゴリの数、最大範囲サイズなどの複数の部分で構成されているため、FSFI--Free Space Fragmentation Index (Free Space Fragmentation Index) の値を使用して、次のことを直感的に反映できます。
FSFI=100*SQRT(最大(範囲)/合計(範囲))*1/SQRT(SQRT(カウント(範囲)))
見てわかるように、FSFI の最大値は 100 (理想的な単一テーブルスペース) です。スコープが増加すると、FSFI 値はゆっくりと減少し、最大スコープ サイズが減少すると、FSFI 値は急速に減少します。
次のスクリプトを使用して FSFI 値を計算できます。
rem FSFI 値の計算
レム fsfi.sql
列 FSFI 形式 999,99
select tablespace_name,sqrt(max(ブロック)/sum(ブロック))*
(100/sqrt(sqrt(カウント(ブロック)))) FSFI
dba_free_space から
tablespace_name ごとにグループ化し、1 つずつ並べます。
スプール fsfi.rep;
/
スプールオフ。
たとえば、特定のデータベースでスクリプト fsfi.sql を実行すると、次の FSFI 値が失われます。
TABLESPACE_NAME FSFI
----------------------------- -------
RBS 74.06
システム 100.00
気温 22.82
ツール 75.79
ユーザー 100.00
USER_TOOLS 100.00
YDCX_DATA 47.34
YDCX_IDX 57.19
YDJF_DATA 33.80
YDJF_IDX 75.55
---- データベースの FSFI 値が計算されると、比較可能なパラメーターとして使用できます。十分な有効空きスペースがあり、FSFI 値が 30 を超える表スペースでは、有効空きスペースの問題が発生することはほとんどありません。スペースが同等のパラメータに近い場合は、最適化する必要があります。
4. フリーカテゴリーの断片を整理する
表スペースの pctincrease 値がゼロ以外です
表スペースのデフォルトのストレージ・パラメーター pctincrease をゼロ以外に変更できます。通常は次のように 1 に設定します。
テーブルスペースの温度を変更する
デフォルトのストレージ (pctincrease 1);
このようにして、SMON は無料のカテゴリを自動的にグループ化します。無料のカテゴリを手動でグループ化することもできます。
テーブルスペースの一時結合を変更します。
5. 段落の断片を拾う
セグメントはカテゴリで構成されていることがわかっています。場合によっては、セグメントのフラグメントをクリーンアップする必要があります。セグメント関連の情報を表示するには、データ ディクショナリ dba_segments を表示し、カテゴリ情報については、データ ディクショナリ dba_extents を表示します。
クエリデータセグメント
USER_EXTENTS からセグメント名、テーブルスペース名、バイト、ブロックを選択します。
ディレクトリセグメントのクエリ
USER_EXTENTS からインデックス名、テーブル所有者、テーブル名、テーブルスペース名を選択します。
dba_segments を通じてセグメント情報を表示する
select tablespacee_name,count(*) nobjects,round(sum(bytes)/1024/1204/1024.2) GB,sum(blocks),sum(extents) from
dba_segments はロールアップ (テーブルスペース名) によってグループ化します。
セグメントが過度に断片化されている場合、そのデータをある範囲に圧縮する最も簡単な方法は、正しいストレージ パラメータを使用してセグメントを再構築し、古いテーブルのデータを新しいテーブルに挿入し、同時に古いテーブルを削除することです。 。このプロセスは、インポート/エクスポート (入力/出力) ツールを使用して実行できます。
Export () コマンドには (圧縮) フラグがあり、テーブルを読み取るときに、Export がテーブルに割り当てられた物理スペースの量を決定し、新しい初期化ストレージ パラメータを出力ダンプ データに書き込みます。 all スペースを割り当てます。このテーブルが閉じている場合は、Import () ツールを使用してテーブルを再生成します。このようにして、そのデータは新しい、より大きな初期セグメントに配置されます。例えば:
exp ユーザー/パスワード ファイル=exp.dmp 圧縮=Y 許可=Y インデックス=Y
tables=(テーブル 1、テーブル 2);
出力がスムーズに行われた場合は、エクスポートされたテーブルをライブラリから削除し、出力ダンプ データからテーブルをインポートします。
imp ユーザー/パスワード file=exp.dmp commit=Y バッファ=64000 フル=Y