質問

新しい研究室データベースを設計しています。

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

で区切る予定です created_on 最近入力されたデータのパフォーマンスを向上させるため。列も一緒に増加するため、テーブルも次のように分割されます。 id, 、暗黙的に。Oracle は暗黙のパーティショニングについて知りません。 id テーブル結合のパーティショニングを利用するには id.

2 つの質問:

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

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

役に立ちましたか?

解決

本当の重要な質問です:あなたはIDの範囲で照会する必要があるでしょうか?あなたがID BETWEEN :A AND :Bでクエリを構築する必要がありますそうです。そのため、Oracleは相関パーティションスキームから利益を得ないでしょう。あなたは主キーにGUIDを使用することができ、あなたがINSERTSのためのより良いスケーラビリティを取得します重要なことすべてのために。

他のヒント

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

[編集]

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

  • 1日あたりのサンプルの数を自由に推定する

  • これを最大値として定義し、0に戻るサイクルを定義します

  • yyyymmdd ||を返す関数があります{シーケンス値が左パドされています
    キーが必要なときにトリガーまたはアプリケーション コードから呼び出される、ゼロから適切な固定長まで

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

これは、正直に言うと、かなりトリッキーです。あなたが複数の列に範囲ベースのパーティションを作成することにより、複数列分割は、一つの選択肢です。 11gでは、あなたは、列Aの分割とし、列Bにサブパーティションのいずれかにこれをimplimentことができますが、10gで、あなたは一緒に2列で範囲によってパーティション化する必要があります。私はトリッキーな部分は、おそらく「同期」に2つの分割スキームをしたいので上のパーティションにどのような境界を知ることだと思います。

この場合のパフォーマンスをスピードアップするためには、あなたはまた、あなたが主に参加するテーブルに「CREATED_ON」に対応する格納する必要があります「のtable_id」に参加します。あなたが行う場合は、必ず「table_idが」と「CREATED_ON」の両方に参加できるように、「PARTITION範囲ALL」は「PARTITION範囲SINGLE」に変わります。あなたは、スピードの向上を測定し、追加のストレージコストに対してそれらを量ることができます。

編集ます:

一緒に増加し、両方のフィールドを維持する方法:

ALTER TABLE my_table MODIFY created_on DEFAULT SYSDATE;

そして、すべてあなたのインサートのシーケンスからIDを記入します。

一緒に増加する両方の列を強制するにはどうすればよいですか?

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

  2. created_on の範囲パーティション、 範囲サブパーティション IDで。各パーティションにはサブパーティションが 1 つだけ必要です。

  3. これは新しい DB であるため、11g があると仮定すると、仮想列のチェック制約はどうでしょうか。仮想列 date_partition

    ... の間で created_on が発生した場合そして ...その後、created_onの間に「partition_1」そして ...次に 'partition_2' ...終わり

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top