8.2 型IDまたは属性の索引作成
8.2.1 型判別式の列の索引付け
SYS_TYPEID
ファンクションを使用して、代入可能な列の非表示の型判別式の列に索引を作成できます。型判別式の列には、型IDがあり、この識別子によって、代入可能な列中の各オブジェクト・インスタンスのうち、最も具体的な型が識別されます。
この情報は、IS OF
述語を使用して型に基づいてフィルタにかける問合せの評価に使用されるものですが、SYS_TYPEID
ファンクションを使用して独自の目的で型IDにアクセスすることも可能です。
一般に、型判別式の列には、わずかな数の型IDのみが格納されています。関連のある型階層に含まれている型の数を超えることはありません。この列はカーディナリティが低いので、ビットマップ索引に適しています。
たとえば、次の文では、表contacts
の代入可能なcontact
列の基礎となる型判別式の列のビットマップ索引を作成します。ファンクションSYS_TYPEID
は、型判別式の列を参照します。
例8-3 代入可能な列のビットマップ索引の作成
-- Requires Ex. 8-1 CREATE TABLE contacts ( contact person_typ, contact_date DATE ); INSERT INTO contacts VALUES ( person_typ (65,'Vrinda Mills', '1-650-555-0125'),'24 Jun 2003' ); INSERT INTO contacts VALUES ( person_typ (12, 'Bob Jones', '650-555-0130'),'24 Jun 2003' ); INSERT INTO contacts VALUES ( student_typ(51, 'Joe Lane', '1-650-555-0140', 12, 'HISTORY'),'24 Jun 2003' ); INSERT INTO contacts VALUES ( part_time_student_typ(52, 'Kim Patel', '1-650-555-0135', 14, 'PHYSICS', 20),'24 Jun 2003' ); CREATE BITMAP INDEX typeid_idx ON contacts (SYS_TYPEID(contact));
8.2.2 代入可能なサブタイプの索引付け
代入可能な列内に格納できる型の属性に対して索引を作成できます。
サブタイプの属性は、TREAT
ファンクションを使用して目的のサブタイプ(およびそのサブタイプ)以外の型をフィルタにかけて排除することによってCREATE INDEX
文で参照できます。その後、ドット表記によって、希望の属性を指定します。
たとえば、次の文では、contacts
表にある、すべての学生のmajor
属性に対する索引が作成されます。contact
列の宣言された型はperson_typ
で、student_typ
がそのサブタイプです。したがって、この列にはperson_typ
、student_typ
のインスタンスおよびいずれかのサブタイプが格納されます。
例8-4 すべての学生の属性に対する索引の作成
-- Requires Ex.8-1- and 8-3 CREATE INDEX major1_idx ON contacts (TREAT(contact AS student_typ).major);
student_typ
型は、最初にmajor
属性を定義しました。person_typ
スーパータイプにこれはありません。したがって、major
属性に対する非表示列のすべての値は、個人の型student_typ
またはparttimestudent_typ
(student_typ
サブタイプ)に対する値です。つまり、非表示列の値は、TREAT
式によって戻される値、学生のサブタイプも含めてすべての学生のmajor
の値と同一であることを意味しています。つまり、非表示列もTREAT
式も、学生については専攻を、学生以外についてはNULLをリストします。このことを利用して、非表示列に対して索引major1_idx
が通常のBツリー索引として作成されます。
非表示列の値は、前述のように、TREAT
ファンクションのターゲットとして指定された型(student_typ
)が最初にそのmajor
属性を定義した型である場合にかぎり、TREAT
式によって戻される値と同一です。TREAT
ファンクションのターゲットが単にその属性を継承するサブタイプである場合は、次の例のように、TREAT
式は、サブタイプ(定時制の学生)に対してはNULL以外のmajor
値を戻しますが、スーパータイプ(その他の学生)に対してはNULL以外の値を戻しません。
CREATE INDEX major2_idx ON contacts (TREAT(contact AS part_time_student_typ).major);
この場合、非表示列にmajor
の値として格納されている値は、TREAT
式の結果とは異なっている場合があります。したがって、通常のBツリー索引を基礎となる列に対して作成することはできません。したがって、データベースでは、TREAT
式は他のすべてのファンクション・ベースの式と同様に処理され、索引を、結果に対するファンクション索引として作成する試みが行われます。
次の例では、前述の例と同様に、定時制の学生のmajor
属性に対してファンクション索引を作成しますが、この例では、major
の非表示列は、代入可能なオブジェクト表person_obj_table
に対応付けられています。
CREATE INDEX major3_idx ON person_obj_table p (TREAT(VALUE(p) AS part_time_student_typ).major);