sql >> データベース >  >> RDS >> Oracle

Oracleパーティション表

    Oracle Partitioned Tableとは何ですか?

    パーティショニングは、テーブル、インデックス、またはインデックス編成テーブルをより小さなコンポーネントに分割します。各コンポーネントは、パーティション(または複合パーティションオブジェクトのサブパーティション)と呼ばれます。すべてのパーティションには一意の名前があり、オプションで個別のストレージ特性を持つ場合があります。たとえば、圧縮や、異なるテーブルスペースへの格納などがあります。適切に設計されたパーティショニング戦略は、操作を単一またはサブセットのパーティションに制限することにより、クエリアクセスと更新を改善できます。

    パフォーマンスのためのパーティション化–パーティションのプルーニング

    Oracleパーティション表機能を使用すると、クエリオプティマイザは特定のSQLステートメントで必要とされないパーティションをスキップできます。 SQLステートメントに応じて、オプティマイザは、アクセスする必要のあるパーティションとサブパーティション、およびアクセスする必要のないサブパーティションを識別できます。これにより、オプティマイザは追加の述語が存在する場合にさらに絞り込めるデータの特定のサブセットに焦点を合わせるため、クエリのパフォーマンスが大幅に向上する可能性があります。

    オプティマイザは、に保存されているパーティション情報を使用してこれを行います。パーティションに含まれるデータを照会せずに、パーティションのコンテンツを識別するためのデータディクショナリ。パーティショニングは、テーブル/インデックスとテーブルスペースの間のデータディクショナリの追加レイヤーです

    パーティションテーブルの制限

    Oracle Database 11gでは、テーブルに最大1048575(1024K – 1)のパーティションを含めることができます。 LONGまたはLONG​​RAWデータ型の列を含むテーブルを除いて、すべてのテーブルをパーティション化できます(CLOBまたはBLOBタイプの列を含む)。

    テーブルパーティションのタイプ

    パーティショニングは8.0バージョンからOracleデータベースで利用可能であり、Oracleはリリースごとに継続的に機能を追加しています。次の表に主な変更点の概要を示します

    Oracleが提供する主なパーティション戦略は、
    (1)範囲
    (2)リスト
    (3)ハッシュ
    (4)複合

    です。

    パーティションテーブルの作成方法

    パーティションの種類に応じて、パーティションテーブルを作成する方法は次のとおりです

    範囲分割

    Oracleは、Partitionキーの連続する値の範囲に基づいてデータをパーティション化します。
    各パーティションのエンドポイントは、次の構文を使用して指定されます。

     VALUES LESS THAN(値リスト)

     CREATE TABLE EXP_RANGE(ID NUMBER(15)NOT NULL、CODE_ID NUMBER(15)NOT NULL、PERIOD_NAME VARCHAR2(15)NOT NULL、ACTUAL_FLAG VARCHAR2(1)NOT NULL、VERSION_ID NUMBER(15)、LAST_UPDATE_DATE DATE NOT NULL、 。>> 

    範囲パーティションの境界はテーブルとインデックスのパーティションの順序を定義するため、範囲パーティションは履歴データとトランザクションデータのパーティション化に役立ちます

    リストの分割

    この方法では、Oracleはリテラル値の静的リストに基づいて、特定の行をパーティションにマップします。リスト分割のパーティションキーは、単一の列にのみ基づくことができます。

     CREATE TABLE EXP_LIST(ID NUMBER NOT NULL、ORG_ID NUMBER、OPEN_FLAG VARCHAR2(4)NOT NULL、.. .. ..)PARTITION BY LIST(open_flag)(PARTITION PR1 VALUES('YES')、PARTITION PR2 VALUES( 'NO')); 

    ハッシュ分割

    このオラクルでは、ハッシュアルゴリズムを使用して、データの物理的な配置を決定しました。ハッシュパーティショニングは、データを固定数のパーティションに均等に分散します。

     CREATE TABLE EXP_HASH(ID NUMBER NOT NULL、ORG_ID NUMBER、ORDERED_ITEM VARCHAR2(2000)、OPEN_FLAG VARCHAR2(1)NOT NULL、。。。。。。。)PARTITION BY HASH(ID)PARTITIONS10。 。 。 。 。 。; ); 

    複合パーティション化

    このオラクルでは、範囲、リスト、およびハッシュのパーティション化の組み合わせを使用しました。複合パーティション化メソッドは、範囲ハッシュまたは範囲リストです。

     CREATE TABLE sales_details(prod_id NUMBER(6)、cust_id NUMBER、time_id DATE、channel_id VARCHAR2(1)、promo_id NUMBER(6)、quantity_sold NUMBER(3)、amount_sold NUMBER(10,2))PARTITION BY RANGE(time_id )SUBPARTITION BY HASH(cust_id)SUBPARTITIONS 8 STORE IN(ts1、ts2、ts3、ts4)(PARTITION sales_q1_2019 VALUES LESS THAN(TO_DATE('01 -APR-2019'、' dd-MON-yyyy'))、PARTITION sales_q2_2019 VALUES LESS THAN(TO_DATE('01 -JUL-2019'、' dd-MON-yyyy'))、PARTITION sales_q3_2019 VALUES LESS THAN(TO_DATE(' 01 -OCT-2019'、' dd-MON-yyyy'))、PARTITION sales_q4_2019 VALUES LESS THAN(TO_DATE('01 -JAN-2019'、' dd-MON-yyyy'))); 

    既存のオブジェクトをパーティション化されたオブジェクトに移動する方法

    この偉業を達成する方法はたくさんあります。ここでは、単純な方法について説明します。
    1.partitioned句とparallelオプションを使用して空のパーティションテーブルを作成します。テーブル名は、パーティション化されていないテーブルとは異なる名前にする必要があります。
    2.パーティション化されていないテーブルから必要なパーティションのデータを入力します。
    3。優れたパフォーマンスを提供する簡単なコード変更として、INSERTステートメントでAPPENDoracleヒントを使用することを検討してください。ロギングが有効で、インデックスが存在する場合、INSERT / * + APPEND * /ヒントは効果的でない可能性があります。インデックスのメンテナンスのオーバーヘッドを最小限に抑えるために、移行前にインデックスを削除し、パーティションテーブルにデータが入力されたらインデックスを再作成します。
    4.パーティションテーブルの名前を元のテーブルと同じ名前に変更するか、シノニムを変更します。
    5。パーティションテーブルのテーブルインデックスを作成する

    また読む
    Oracle Partition Index
    Oracle Parallel Query
    https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm


    1. Oracle.ManagedDataAccess.EntityFramework-ORA-01918:ユーザー'dbo'は存在しません

    2. 1つのパラメータで複数の値を渡す

    3. フラットjsonb配列の要素に対するLIKEクエリ

    4. コマンドラインを使用してデータベースをエクスポートする方法