8.2 型IDまたは属性の索引作成

型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_typstudent_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);