Oracle Database 管理者ガイド 11gリリース1(11.1) E05760-03 |
|
この章の内容は次のとおりです。
ハッシュ・クラスタに表を格納することは、データ検索のパフォーマンスを改善するための1つの選択肢です。ハッシュ・クラスタは、索引付きの非クラスタ化表または索引クラスタの代替手段を提供します。索引付きの表または索引クラスタでは、Oracle Databaseは、表内の行の位置を特定するために、別個の索引に格納しているキー値を使用します。ハッシングを使用するには、ハッシュ・クラスタを作成し、そこに表をロードします。表の行は物理的にはハッシュ・クラスタに格納され、ハッシュ関数の結果に従って検索されます。
Oracle Databaseはハッシュ関数を使用して、特定のクラスタ・キー値に基づく、ハッシュ値と呼ばれる数値の分布を生成します。ハッシュ・クラスタのキーは、索引クラスタのキーと同じように単一列キーでもコンポジット・キー(複数列キー)でもかまいません。ハッシュ・クラスタ内で行を検索または格納する場合、データベースは行のクラスタ・キー値にハッシュ関数を適用します。結果として生成されるハッシュ値はクラスタ内のデータ・ブロックに対応しており、データベースは、発行された文のかわりにそのデータ・ブロックに対して読取りまたは書込みを行います。
索引付きの表または索引クラスタ内の行を検索または格納するためには、少なくとも2回(通常はそれ以上)のI/Oを実行する必要があります。
一方、ハッシュ・クラスタでは、ハッシュ関数を使用して行の位置が特定されるので、I/Oは必要ありません。結果として、ハッシュ・クラスタ内の行の読込みや書込みに必要とされるのは最小限のI/O操作のみになります。
ここでは、ハッシングが最も有効な場合と有効でない場合を対比することによって、ハッシュ・クラスタを使用すべき状況を判断する際に役立つ情報を提供します。ハッシングではなく索引を使用する場合は、表を個別に格納するのか、またはクラスタの一部として格納するのかを考慮してください。
ハッシングは、次のような状況で有効です。
SELECT ... WHERE cluster_key = ...;
このような場合、等価条件内のクラスタ・キーがハッシュされ、対応するハッシュ・キーが通常1回の読込みで検索されます。それに対して、索引付きの表では、最初にキー値を索引内で検索する必要があります(通常複数回の読込み)。その後で行が表から読み込まれます(別の読込み)。
ハッシングは次のような状況では有効ではありません。
SELECT . . . WHERE cluster_key < . . . ;
索引では、キー値はその索引内で順序付けられており、問合せのWHERE
句を満たすクラスタ・キー値を、比較的少ないI/Oで見つけることができます。
ハッシュ・クラスタを作成するには、HASHKEYS
句を指定したCREATE CLUSTER
文を使用します。次の例では、trial
表を格納するクラスタtrial_cluster
を作成し、trialno
列(クラスタ・キー)によってクラスタ化する文と、クラスタ内に表を作成する文を示しています。
CREATE CLUSTER trial_cluster (trialno NUMBER(5,0)) TABLESPACE users STORAGE (INITIAL 250K NEXT 50K MINEXTENTS 1 MAXEXTENTS 3 PCTINCREASE 0) HASH IS trialno HASHKEYS 150; CREATE TABLE trial ( trialno NUMBER(5,0) PRIMARY KEY, ...) CLUSTER trial_cluster (trialno);
索引クラスタの場合と同様に、ハッシュ・クラスタのキーは、単一列でもコンポジット・キー(複数列のキー)でもかまいません。この例では、単一列が使用されています。
HASHKEYS
値(この例では150)は、クラスタに使用されるハッシュ関数で生成できる一意のハッシュ値の数を指定し、制限します。指定した値は最も近い素数に丸められます。
HASH IS
句を指定しない場合は、内部ハッシュ関数が使用されます。すでにクラスタ・キーがその範囲に均一に分布する一意識別子の場合は、内部ハッシュ関数を無視し、前述の例のようにクラスタ・キーをハッシュ値として指定できます。また、HASH IS
句を使用して、ユーザー定義のハッシュ関数を指定することもできます。
ハッシュ・クラスタのクラスタ索引は作成できませんが、ハッシュ・クラスタ・キーに索引を作成する必要はありません。
クラスタ内に表を作成する方法、索引とハッシュ・クラスタに共通するCREATE CLUSTER
文のパラメータ設定のガイドライン、およびクラスタを作成するために必要な権限の追加情報は、第20章「クラスタの管理」を参照してください。次の項では、ハッシュ・クラスタ固有のCREATE CLUSTER
文のパラメータの設定とそのガイドラインについて説明します。
ソートされたハッシュ・クラスタでは、ハッシュ関数の各値に対応する行が、指定された列のセットの昇順でソートされます。これにより、クラスタ化したデータの後続の操作では応答時間が改善されます。
たとえば、電話会社では、1つの交換機を介した固定数の発信電話番号について、詳細な通話記録を保存する必要があります。各発信電話番号から、無制限の通話件数が発生する可能性があります。
通話時に保存された通話記録は、後で請求書を作成するときに、発信電話番号ごとに先入れ先出し(FIFO)で処理されます。各通話には、タイムスタンプによって識別される詳細な通話記録があります。次のようなデータが収集されます。
発信電話番号 | タイムスタンプによって識別される通話記録 |
---|---|
650-555-1212 |
t0, t1, t2, t3, t4, ... |
650-555-1213 |
t0, t1, t2, t3, t4, ... |
650-555-1214 |
t0, t1, t2, t3, t4, ... |
... |
... |
次のSQL文では、telephone_number
列がハッシュ・キーです。ハッシュ・クラスタは、call_timestamp
およびcall_duration
列でソートされます。ハッシュ・キーの数は、10桁の電話番号に基づいています。
CREATE CLUSTER call_detail_cluster ( telephone_number NUMBER, call_timestamp NUMBER SORT, call_duration NUMBER SORT ) HASHKEYS 10000 HASH IS telephone_number SIZE 256; CREATE TABLE call_detail ( telephone_number NUMBER, call_timestamp NUMBER SORT, call_duration NUMBER SORT, other_info VARCHAR2(30) ) CLUSTER call_detail_cluster ( telephone_number, call_timestamp, call_duration );
データのソート順を指定すると、次の問合せにより、指定のハッシュ・キーの通話記録が最も古いレコードから順に戻されます。
SELECT * WHERE telephone_number = 6505551212;
表中の行への高速なアクセスを提供する単一表ハッシュ・クラスタを作成できます。ただし、この表はハッシュ・クラスタ内の唯一の表にする必要があります。ハッシュ・キーとデータ行の間に1対1のマッピングが必要となるためです。次の文は、クラスタ・キーvariety
を持つ単一表ハッシュ・クラスタpeanut
を作成します。
CREATE CLUSTER peanut (variety NUMBER) SIZE 512 SINGLE TABLE HASHKEYS 500;
HASHKEYS
値は最も近い素数に丸められるため、このクラスタはそれぞれサイズ512バイトのハッシュ・キー値を最大503個持ちます。SINGLE TABLE
句は、ハッシュ・クラスタにのみ有効です。また、必ずHASHKEYS
も指定する必要があります。
ハッシュ・クラスタを作成するときは、パフォーマンスと使用領域が最適になるように、クラスタ・キーを正しく選択し、HASH IS
、SIZE
およびHASHKEYS
の各パラメータを設定することが重要です。次に示すガイドラインでは、これらのパラメータを設定する方法について説明します。
正しいクラスタ・キーの選択は、クラスタ化表に対して最もよく発行される問合せのタイプによって決まります。たとえば、ハッシュ・クラスタ内のemp
表について検討します。問合せが従業員番号によって行を頻繁に選択する場合、最適なクラスタ・キーはempno
列です。問合せが部門によって行を頻繁に選択する場合、最適なクラスタ・キーはdeptno
列です。単一の表を含むハッシュ・クラスタの場合は、通常、含まれる表の主キー全体をクラスタ・キーにします。
ハッシュ・クラスタのキーは、索引クラスタのキーと同じように単一列でもコンポジット・キー(複数列キー)でもかまいません。コンポジット・キーによるハッシュ・クラスタは、データベースの内部ハッシュ関数を使用する必要があります。
HASH IS
パラメータを指定するのは、クラスタ・キーがNUMBER
データ型の単一の列であり、均一に分布した整数を含む場合のみです。この条件を満たしていれば、それぞれの一意のクラスタ・キー値が衝突(同じハッシュ値を持つクラスタ・キーが2つ発生すること)せずに一意のハッシュ値にハッシュするように、クラスタ内に行を分散させることができます。この条件が当てはまらない場合は、この句を指定せずに内部ハッシュ関数を使用してください。
SIZE
は、ハッシュ・キーに対応するすべての行を保持するために必要な領域の平均サイズに設定します。そのため、SIZE
を適切に決定するには、格納するデータの特性をよく理解する必要があります。
SIZE
はクラスタ内の平均の行サイズに設定できます。
SIZE
は代表的なハッシュ値に対応するすべての行を保持するために必要な領域の平均サイズに設定できます。
また、SIZE
の見積り値を決定した後で、次の点を考慮してください。SIZE
の値が小さい場合(データ・ブロックごとに5つ以上のハッシュ・キーを割り当てることができる場合)は、その値をCREATE CLUSTER
文のSIZE
に使用できます。しかし、SIZE
の値が大きい場合(データ・ブロックごとに割当て可能なハッシュ・キーが4つ以下の場合)は、衝突の発生頻度を予測し、データ検索パフォーマンスと領域使用効率のどちらを重視するか検討する必要があります。
HASH IS
を指定した場合)、衝突がわずかであるか、または衝突のないことが予想される場合は、見積り値をそのままSIZE
に設定できます。この場合、衝突は発生せず、領域は可能なかぎり効率的に使用されます。
SIZE
を調整する必要があります。ブロック当たりの使用可能領域/算出されたSIZE | SIZEの設定 |
---|---|
1 |
|
2 |
|
3 |
|
4 |
|
>4 |
|
ただし、SIZE
の値を過大に見積ると、クラスタ内の未使用領域を増やすことになります。領域効率がデータ検索のパフォーマンスよりも重要な場合は、前述の表で示した調整を無視して、SIZE
に元の値を使用してください。
ハッシュ・クラスタ内の行を最大限まで分散させるために、データベースはHASHKEYS
値を最も近い素数に丸めます。
次に示す例では、クラスタ・キーを正しく選択し、HASH IS
、SIZE
およびHASHKEYS
の各パラメータを設定する方法を示します。すべての例において、データ・ブロック・サイズは2KBで、利用可能なデータ領域(ブロック・サイズからオーバーヘッドを差し引いた領域)の平均は各ブロックの1,950バイトとします。
ハッシュ・クラスタにemp
表をロードすることになりました。ほとんどの問合せは、従業員番号によって従業員レコードを検索します。emp
表の最大行数は常に10,000、平均の行サイズは55バイトと見積られています。
この場合は、empno
をクラスタ・キーにします。この列には一意の整数が格納されているので、内部ハッシュ関数は無視できます。SIZE
は平均の行サイズ(55バイト)に設定できます。これにより、各データ・ブロックに34のハッシュ・キーが割り当てられます。HASHKEYS
は、表の行数である10,000に設定できます。この値は、10,000より大きい最初の素数である10,007に切り上げられます。
CREATE CLUSTER emp_cluster (empno NUMBER) . . . SIZE 55 HASH IS empno HASHKEYS 10000;
前述の例と同様の条件を考えます。ただし、この例では、ほとんどの場合、行が部門番号によって検索されるとします。平均10名の従業員を持つ部門が最大で1,000部門存在します。部門番号は10ずつ増加します(0、10、20、30、...)。
この場合は、deptno
をクラスタ・キーにします。この列には一様に分布する整数が格納されているので、内部ハッシュ関数は無視できます。事前に見積ったSIZE
(各部門のすべての行を保持するために必要な領域の平均サイズ)は55×10バイト、つまり550バイトです。SIZE
にこの値を使用して、各データ・ブロックに3つのハッシュ・キーのみを割り当てることができます。いくらかの衝突が予想される状況で、最大限のデータ検索パフォーマンスが必要な場合、オーバーフロー・ブロックを必要とする衝突を防ぐために、見積りのSIZE
を少し変更してください。ここでは、SIZE
を12%調整して620バイトにします(「SIZEパラメータの設定」を参照)。これにより、予想される衝突を考慮した上で行の領域をより多く確保できます。
HASHKEYS
は、一意の部門番号の数である1,000に設定できます。この値は、1,000より大きい最初の素数である1,009に切り上げられます。
CREATE CLUSTER emp_cluster (deptno NUMBER) . . . SIZE 620 HASH IS deptno HASHKEYS 1000;
索引クラスタの場合と同じように、ハッシュ・クラスタ内のデータに必要な記憶域を見積ることは重要です。
Oracle Databaseは、SIZE
およびHASHKEYS
の設定に従って、ハッシュ表の格納に十分な領域の初期割当てを保証します。ハッシュ表サイズを考慮せずに記憶域パラメータINITIAL
、NEXT
およびMINEXTENTS
を設定した場合は、少なくともSIZE*HASHKEYS
に達するまで増分(追加の)エクステントが割り当てられます。たとえば、データ・ブロック・サイズが2KB、各ブロックの使用可能なデータ領域(ブロック・サイズからオーバーヘッドを差し引いた領域)が約1,900バイトの場合に、CREATE CLUSTER
文でSTORAGE
パラメータとHASH
パラメータを次のように指定したとします。
STORAGE (INITIAL 100K NEXT 150K MINEXTENTS 1 PCTINCREASE 0) SIZE 1500 HASHKEYS 100
この例では、各データ・ブロックにハッシュ・キーを1つのみ割り当てることができます。そのため、ハッシュ・クラスタが必要とする初期領域は少なくとも200KB(100×2KB)です。しかし、記憶域パラメータの設定にはこの要件が考慮されていません。そのため、100KBの初期のエクステントと150KBの増分のエクステントがハッシュ・クラスタに割り当てられます。
一方、HASH
パラメータが次のように指定されたとします。
SIZE 500 HASHKEYS 100
この場合、各データ・ブロックに3つのハッシュ・キーが割り当てられます。そのため、ハッシュ・クラスタが必要とする初期領域は少なくとも68KB(34×2KB)です。記憶域パラメータの初期設定はこの要件を満たしているため、100KBの初期エクステントがハッシュ・クラスタに割り当てられます。
ハッシュ・クラスタは、ALTER CLUSTER
文を使用して変更できます。
ALTER CLUSTER emp_dept . . . ;
ハッシュ・クラスタの変更に関係する問題は、「クラスタの変更」で説明されている索引クラスタを変更する場合と同じです。ただし、SIZE
、HASHKEYS
およびHASH IS
の各パラメータはALTER CLUSTER
文に指定できません。これらのパラメータを変更するには、クラスタを再作成して、元のクラスタからデータをコピーする必要があります。
ハッシュ・クラスタは、DROP CLUSTER
文を使用して削除できます。
DROP CLUSTER emp_dept;
ハッシュ・クラスタ内の表は、DROP TABLE
文を使用して削除されます。ハッシュ・クラスタとハッシュ・クラスタ内の表の削除についての問題は、索引クラスタの場合と同じです。
次のビューには、ハッシュ・クラスタに関する情報が表示されます。