3

新しい検査データベースを設計しています。

私のプライマリ データ テーブルには、少なくともid (PK NUMBER)とがありcreated_on (DATE)ます。また、任意の 2 つのエントリについて、より高いエントリの日付idが遅くなりcreated_onます。

created_on最近入力されたデータのパフォーマンスを向上させるために、パーティション化する予定です。列が一緒に増加するため、テーブルもid暗黙的に によって分割されます。idOracle は、 によるテーブル結合のパーティション化を利用するための暗黙のパーティション化について認識しませんid

2 つの質問:

  1. 両方の列を同時に増加させるにはどうすればよいですか?

  2. テーブル結合でこの暗黙的なパーティション分割を利用するにはどうすればよいですか?

4

5 に答える 5

4

私の意見では、パーティション化の決定は、パフォーマンスよりもテーブルのメンテナンス アクティビティ (パージ、アーカイブなど) の必要性に基づいて行う必要があります。あなたの場合、おそらく日付範囲のサンプルでインデックス範囲スキャンを実行していると思いますので、日付インデックスがローカルに (グローバルではなく) パーティション化されていることも確認してください。これにより、パーティションを切り捨てた場合にインデックスを再構築する必要もなくなります。また、PK の結合は行 ID によるシークを使用するため、インデックス範囲スキャンの後に発生し、パーティショニングがこれに影響を与える方法はないと思います。

[編集]

PK 列と CREATED_ON 列の関連付けに関しては、YYYYMMDD のプレフィックスが付いたシーケンスから数値キーを構築するいくつかのシステムを使用していますが、これは非常にうまく機能します。次のことを行う必要があります。

  • 1 日あたりのサンプル数を自由に見積もる

  • これを最大値とし、0 に戻るシーケンスを定義します。

  • YYYYMMDD || を返す関数を用意する
    キーが必要なときにトリガーまたはアプリケーション コードから呼び出される {適切な固定長になるまでゼロで左詰めされたシーケンス値}

キーに意味を埋め込むことに同意しない人もいますが、実際には、サンプル ID を見て、それがいつ処理されたかを把握することは役に立ちます。

于 2009-08-14T15:43:09.587 に答える
2

本当に重要な質問は、ID の範囲でクエリを実行する必要があるかどうかです。でクエリを作成する必要はほとんどありませんID BETWEEN :A AND :B。したがって、Oracle は相関パーティション スキームの恩恵を受けません。主キーにa を使用するGUIDと、 のスケーラビリティが向上しINSERTSます。

于 2009-08-25T08:32:56.997 に答える
1

正直言ってかなり難しいです。複数列のパーティション化は 1 つのオプションです。これにより、複数の列に範囲ベースのパーティションを作成できます。11g では、これを列 A でのパーティション化と列 B でのサブパーティション化として実装できますが、10g では、2 つの列を一緒に範囲でパーティション化する必要があります。難しいのは、おそらく 2 つのパーティショニング スキームを「同期」させたいため、パーティショニングする境界を知ることだと思います。

于 2009-08-14T15:47:03.793 に答える
1

この場合、「table_id」での結合のパフォーマンスを高速化するには、主に結合するテーブルに対応する「created_on」も格納する必要があります。これを行うと、いつでも「table_id」と「created_on」の両方に参加できるため、「PARTITION RANGE ALL」は「PARTITION RANGE SINGLE」に変わります。速度の向上を測定し、追加のストレージ コストと比較検討できます。

編集:

両方のフィールドを一緒に増やし続ける方法:

ALTER TABLE my_table MODIFY created_on DEFAULT SYSDATE;

そして、すべてのインサートにシーケンスから ID を入力します。

于 2009-08-14T20:38:40.353 に答える
0

両方の列を同時に増加させるにはどうすればよいですか?

  1. バルク ロードであり、id がバルク ロード時に生成されたシーケンスであると仮定すると、ロード間で ALTER SEQUENCE を実行して、各パーティションに使用されるシーケンスの範囲をより詳細に制御できます。シーケンスと作成日が一括ロードの前に割り当てられている場合、ETL プロセスに各作成日の最小/最大 ID を特定するステージが必要になる場合があります。

  2. created_on のレンジ パーティション、id のレンジ サブパーティション。各パーティションには、1 つのサブパーティションのみを含める必要があります。

  3. これは新しい DB であるため、仮想列のチェック制約について 11g を使用すると仮定します。仮想列 date_partition

    CASE WHEN created_on BETWEEN ... AND ... THEN 'PARTITION_1' WHEN created_on BETWEEN ... AND ... THEN 'PARTITION_2' ... END

id_partition の同様の仮想列ですが、各パーティションの最小/最大 PK を取得するにはクエリを実行する必要があります。主キーであるため、インデックスがあるため、迅速に行う必要があります。

次に、id_partition = date_partition のような制約を追加します

于 2009-08-24T23:00:36.640 に答える