12

Oracleデータベースを使用していますが、データをテーブルに分割できる必要があります。Rracleには、データをバケットに分割できるora_hash関数があることを理解しています。ora_hash関数は決定論的ですか?

私のプログラムでは、いくつかの異なるデータベースクエリを作成し、各クエリで異なるバケット番号を要求します。

たとえば、1つのクエリで、最初の2つのバケットを要求する場合があります。

SELECT * FROM sales WHERE ORA_HASH(cust_id, 9) in (0,1);

後続のクエリで、2番目と3番目のバケットを要求する場合があります。

SELECT * FROM sales WHERE ORA_HASH(cust_id, 9) in (1,2);

上記の例では、ora_hashは常にテーブルをまったく同じ10個のバケットに分割しますか?テーブル内のデータは変更されていないと想定します。2番目のバケット(バケット1)は、両方のクエリで同一ですか?

シード値により、Oracleが同じデータセットに対して異なる結果を返すことができることを示唆するドキュメントがあります。したがって、シード値を使用しない場合、ora_hashは決定論的であると想定しています。ドキュメントを参照してください。

4

2 に答える 2

16

ORA_HASHNUMBER、VARCHAR、DATE などのパーティショニングに使用できるデータ型については、間違いなく決定論的です。

ただし、CLOB などの他のデータ型の少なくとも一部については決定論的でORA_HASHはありません。


私の答えは、 に関するこのジョナサン・ルイスの記事に基づいていORA_HASHます。

ジョナサン・ルイスは、それらが決定論的であると明示的に述べていませんが、ORA_HASH「ハッシュパーティション化されたテーブルで行が属するパーティションを決定するために、ゼロシードで内部的に使用される関数のようです」と述べています. また、ハッシュ パーティショニングに使用する場合は、決定論的でなければなりません。そうしないと、パーティションごとの結合が機能しません。

ORA_HASH一部のデータ型で非決定論的である可能性があることを示すには、次のクエリを実行します。これは、同じ記事のコメントからのものです。

with src as (select to_clob('42') val from dual connect by level<=5)
select val,ora_hash(val,7) from src order by 2;

驚くべきことに、これと同じ問題がdbms_sqlhash.gethash.

于 2012-02-28T05:06:11.463 に答える
5

Jon Heller の回答にはさらに詳細が含まれているため、彼の回答に賛成票を投じてください。これはまだ受け入れられている回答であるため、彼の回答の一部をインライン化します。

ORA_HASHNUMBERVARCHAR、などのパーティショニングに使用できるデータ型については、確実に決定論的ですDATE

ただしORA_HASH、 などの他のデータ型の少なくとも一部については決定論的ではありませんCLOB

于 2012-02-26T04:02:35.900 に答える