Oracleデータ・パフォーマンスの最適化に関するいくつかのコツ

4209 ワード

Oracleデータベースは、信頼性、セキュリティ、互換性の高い企業でますます人気を集めています.Oracleデータベースのパフォーマンスを向上させる方法は、多くのデータベース管理者が関心を持っている問題です.以下の点を考慮することをお勧めします.
パーティション
実際の経験によれば、大きなデータベースでは、データベース空間のほとんどが少量のテーブルによって占有されています.大規模なデータベースの管理を簡素化し、アプリケーションのクエリー性能を改善するために、一般的にパーティションという手段を使用することができます.パーティションとは、テーブル内のレコードを動的にいくつかの異なるテーブル空間に分離し、データを物理的に分割し、メンテナンス、バックアップ、リカバリ、トランザクション、クエリーのパフォーマンスを容易にすることです.使用すると、すべてのパーティションを接続するビューを作成し、論理的に全体的に表示できます.
1.パーティション表の作成:
<ccid_code>Create table Employee ( <br>EmpNo varchar2(10) primary key, <br>Name varchar2(30), <br>DeptNo Number(2) <br>) <br>Partition by range(DeptNo) <br>( partition PART1 values less than (11) <br>tablespace PART1_TS, <br>partition PART2 values less than (21) <br>tablespace PART2_TS, <br>partition PART3 values less than (31) <br>tablespace PART3_TS <br>partition PART4 values less than (MAXvalue) <br>tablespace PART4_TS <br>);</ccid_code>

表EmployeeはDeptNo列に従ってパーティション化する.
2.パーティションインデックス:
<ccid_code>Create index Employee_DeptNo on <br>Employee(DeptNo) local ( <br>partition PART1 tablespace PART1_NDX_TS, <br>partition PART2 tablespace PART2_NDX_TS, <br>partition PART3 tablespace PART3_NDX_TS, <br>partition PART4 tablespace PART4_NDX_TS, <br>);</ccid_code>

グローバル・インデックスは、パーティションに多数のトランザクションが発生し、すべてのパーティションのデータ・レコードの一意性を保証するために使用されます.グローバル・インデックスが作成されると、Global句では、テーブル・パーティションの範囲値とは異なるインデックスの範囲値を指定できます.ローカルインデックスが確立されている場合にのみ、インデックスパーティションはテーブル分割区間と一対一に対応します.したがって、ほとんどの場合、ローカルインデックスパーティションを使用する必要があります.このインデックスを使用すると、パーティションはテーブルパーティションにインデックスパーティションを簡単に関連付けることができ、ローカルインデックスはグローバルインデックスよりも管理が容易になります.
3.パーティション管理:
必要に応じて、Alter tableコマンドを使用して、既存のパーティションの構造を追加、削除、交換、移動、変更、名前変更、分割、短縮することもできます.
インデックスの再構築
テーブル内のレコードが頻繁に削除または挿入される場合、テーブル内のレコードの合計量は変わらないにもかかわらず、インデックス空間の使用量は増加します.レコードはインデックスから削除されますが、そのレコードインデックス項目の使用スペースは再使用できません.したがって、テーブルが変化しない場合、インデックス空間の量は増加し続けます.テーブル内のレコード数が増加するかどうかにかかわらず、インデックス内の無効な空間が増加するためです.
削除されたレコードで使用されたスペースを回収するには、Alter index rebuildコマンドを使用します.定期的に実行されるバッチを作成して、最もアクティブなテーブルのインデックスを再構築できます.このバッチは、他のアプリケーションと競合しないように、アイドル時に実行できます.インデックスのこのプログラム計画を堅持すれば、未使用の空間をタイムリーに回収し、空間利用率を高めることができます.
セグメントの断片化
データベース・オブジェクトを生成する場合(テーブルまたはインデックス)、ユーザーのデフォルト値または指定値によってテーブル領域を指定します.オブジェクトの関連データを格納するために表領域で生成されたセグメント.セグメントが閉じられ、収縮され、切断される前に、セグメントに割り当てられた空間は解放されません.
1つのセグメントは範囲で構成され、範囲は隣接するOracleブロックで構成されます.存在する範囲が新しいデータを格納できないと、このセグメントは新しい範囲を取得しますが、これらの範囲が互いに隣接することは必要ありません.このような拡張は、表領域のデータファイルがより多くの自由空間を提供できないか、範囲の数が限界に達するまで継続します.
したがって、断片化されたデータ・セグメントが多すぎると、実行に影響を与えるだけでなく、スペース管理の問題も発表されます.したがって、各データ・セグメントに1つの範囲しか含まれていないことは、非常に有益である.モニタシステムにより、DBA_を確認できます.SEGMENTSデータディクショナリビューでは、どのデータベース・オブジェクトが10以上の範囲のセグメントを含んでいるかを把握し、そのデータ・セグメントの断片化を決定します.
セグメントの断片化が多すぎる場合は、次の2つの方法で解決できます.
1.正しいストレージパラメータで新しいテーブルを作成し、古いテーブルのデータを新しいテーブルに挿入し、古いテーブルを削除する.
2.Export/IPportツールを利用する.
例:
<ccid_code>exp system/manager file=exp.dmp<br>compress=Y grants=Y indexes=Y <br>tables=(T1,T2)</ccid_code>

出力に成功したら、Oracleに入り、上記の表を削除します.
注意:compress=Yは、出力中に格納パラメータが変更されることを示します.
imp system/manager file=exp.dmp commit=Y buffer=64000 full=Y
注意:入力時に新しいストレージパラメータを再構成します.
自由範囲の断片化
表領域の自由範囲の1つは、表領域に接続された自由(空間)ブロックの集合である.セグメントが閉じると、その範囲は解放され、自由範囲としてマークされます.しかしながら、これらの自由範囲は、隣接する自由範囲と結合することはできず、それらの間の境界線は常に存在する.ただし、表領域のデフォルト値pctincrease設定が0でない場合、SMONバックグラウンドプロセスはこれらの隣接する自由範囲を定期的にマージします.pctincreaseが0に設定されている場合、隣接する自由範囲はデータベースによって自動的にマージされません.ただし、Alter tableコマンド「coalesce」オプションを使用して、隣接する自由範囲のマージを強制することができます.
フリーレンジマージは行われず、後日のスペースリクエストでは、テーブルスペースのスペース割り当てに影響します.十分な範囲が必要な場合、他の選択肢がない限り、データベースは隣接する自由範囲をマージしません.これにより、表領域の前の小さい自由範囲が使用されると、表領域の後ろの部分の最大の自由範囲が使用されます.その結果、十分な使用スペースがないため、テーブルスペースの要件が矛盾します.このような状況により、データベースの空間割り当ては理想的に遠ざかる.フリースペースフラグメントは、頻繁に閉じて再生成されるデータベース・テーブルやインデックスによく表示されます.
理想的なOracle表領域では、各データベース・オブジェクトは個別の範囲に格納され、すべての有効な自由領域は巨大で連続した範囲に集中します.これにより、1つのオブジェクトに記憶領域を追加する必要がある場合、十分な自由空間を取得する可能性を増大させるとともに、空間内のループ呼び出しを最小化し、自由空間使用率を向上させることができる.