ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 


SQL> alter index PERSON_INDEX_S
cont>     rebuild partition P3;
%RDB-W-META_WARN, metadata successfully updated with the reported warning
-RDMS-W-IDXBLDPEND, index in build pending state - maintenance is disabled

  • BUILD ALLおよびREBUILD ALL操作は、索引のメンテナンスを自動的に有効にします。

  • ALTER INDEX文を使用して、DATA DEFINITIONモードで予約された表の索引のすべてまたは一部を作成できます。
    次の句がサポートされています。


    BUILD演算子およびREBUILD PARTITION演算子は、新規の索引パーティションの構築にI/Oを消費する可能性があるため、同時実行が最も適しています。


    例1: 索引の無効化

    次の例では、後でデータベースの表がオフラインになった時に削除できるように索引を無効にする方法を示します。


    SQL> alter index COLL_COLLEGE_CODE
    cont> maintenance is disabled;
    SQL> show index COLL_COLLEGE_CODE
    Indexes on table COLLEGES:
    COLL_COLLEGE_CODE               with column COLLEGE_CODE
      No Duplicates allowed
      Type is Sorted
      Key suffix compression is DISABLED
      Index is no longer maintained
      Node size  430
    

    例2: 一意索引から非一意索引への変更


    SQL> show table (index) DEPARTMENTS
    Information for table DEPARTMENTS
    
    Indexes on table DEPARTMENTS:
    DEPARTMENTS_INDEX               with column DEPARTMENT_CODE
      No Duplicates allowed
      Type is Sorted
      Key suffix compression is DISABLED
      Node size  430
    
    SQL> insert into DEPARTMENTS (DEPARTMENT_CODE) values ('SUSO');
    %RDB-E-NO_DUP, index field value already exists;
    duplicates not allowed for DEPARTMENTS_INDEX
    SQL> alter index DEPARTMENTS_INDEX duplicates are allowed;
    SQL> insert into DEPARTMENTS (DEPARTMENT_CODE) values ('SUSO');
    1 row inserted
    SQL> show table (index) DEPARTMENTS
    Information for table DEPARTMENTS
    
    Indexes on table DEPARTMENTS:
    DEPARTMENTS_INDEX               with column DEPARTMENT_CODE
      Duplicates are allowed
      Type is Sorted
      Key suffix compression is DISABLED
      Node size  430
    

    例3: 最後のパーティションの前後への索引パーティションの追加


    SQL> CREATE UNIQUE INDEX EMPLOYEES_INDEX
    cont>     ON EMPLOYEES (EMPLOYEE_ID)
    cont>     TYPE IS HASHED
    cont>     STORE USING (EMPLOYEE_ID)
    cont>         IN JOBS WITH LIMIT OF ('00999');
    SQL> COMMIT;
    SQL> -- To add a partition before the final partition requires
    SQL> -- that the final partition (which now follows the new partition)
    SQL> -- be scanned and matching keys moved to the new partition.
    SQL> SET TRANSACTION READ WRITE
    cont>   RESERVING EMPLOYEES for EXCLUSIVE WRITE;
    SQL> SET FLAGS INDEX_STATS;
    SQL> ALTER INDEX EMPLOYEES_INDEX
    cont>     ADD PARTITION NEW_EMPS_200
    cont>       USING (EMPLOYEE_ID)
    cont>       IN EMP_INFO WITH LIMIT OF ('00200');
    ~Ai alter index "EMPLOYEES_INDEX" (hashed=1, ordered=0)
    ~Ai add partition "NEW_EMPS_200" : area "EMP_INFO"
    ~Ai storage area "EMP_INFO" larea=85
    ~Ai splitting partition #1
    ~Ai split complete: total 100 keys, moved 37 (dups 0)
    ~Ai reads: async 136 synch 30, writes: async 57 synch 0
    SQL> COMMIT;
    SQL> -- Now add a partition after the final partition of
    SQL> -- the index. This requires no I/O to the partition because
    SQL> -- there is no following partition and therefore no keys
    SQL> -- to be moved.
    SQL> SET TRANSACTION READ WRITE
    cont>   RESERVING EMPLOYEES FOR EXCLUSIVE WRITE;
    SQL> ALTER INDEX EMPLOYEES_INDEX
    cont>     ADD PARTITION NEW_EMPS_1400
    cont>       USING (EMPLOYEE_ID)
    cont>       IN EMPIDS_OVER WITH LIMIT OF ('01400');
    ~Ai alter index "EMPLOYEES_INDEX" (hashed=1, ordered=0)
    ~Ai add partition "NEW_EMPS_1400" : area "EMPIDS_OVER"
    ~Ai storage area "EMPIDS_OVER" larea=122
    ~Ai adding new final partition 3
    SQL> COMMIT;
    SQL> -- Show the index.  It shows the ADD PARTITION syntax appended
    SQL> -- to the original source of the index.
    SQL> SHOW INDEX EMPLOYEES_INDEX
    Indexes on table EMPLOYEES:
    EMPLOYEES_INDEX                  with column EMPLOYEE_ID
      No Duplicates allowed
      Type is Hashed Scattered
      Key Suffix Compression is DISABLED
    Store clause:           STORE using (EMPLOYEE_ID)
                                 in JOBS with limit of ('00999')
                            Add Partition partition NEW_EMPS_200
                            using (EMPLOYEE_ID)
                            in EMP_INFO with limit of ('00200')
                            Add Partition partition NEW_EMPS_1400
                            using (EMPLOYEE_ID)
                            in EMPIDS_OVER with limit of ('01400')
    

    例4: パーティション名の変更


    $ rmu /extract /item=index mf_personnel.rdb
    .
    .
    .
    create unique index EMPLOYEES_HASH
        on EMPLOYEES (
        EMPLOYEE_ID)
        type is HASHED
        store
            using (EMPLOYEE_ID)
                in EMPIDS_LOW(
                    partition "SYS_P00076"
                    )
                    with limit of ('00200')
                in EMPIDS_MID(
                    partition "SYS_P00077"
                    )
                    with limit of ('00400')
                otherwise in EMPIDS_OVER(
                    partition "SYS_P00078"
                    );
    commit work;
    $SQL$
    SQL> ATTACH FILENAME MF_PERSONNEL.RDB;
    SQL> ALTER INDEX EMPLOYEES_HASH
    cont> RENAME PARTITION SYS_P00076 TO IDS_LOW;
    SQL> ALTER INDEX EMPLOYEES_HASH
    cont> RENAME PARTITION SYS_P00077 TO IDS_MID;
    SQL> ALTER INDEX EMPLOYEES_HASH
    cont> RENAME PARTITION SYS_P00078 TO IDS_HIGH;
    SQL> COMMIT;
    SQL> SHOW INDEX EMPLOYEES_HASH;
    Indexes on table EMPLOYEES:
    EMPLOYEES_HASH                  with column EMPLOYEE_ID
      No Duplicates allowed
      Type is Hashed Scattered
      Key Suffix Compression is DISABLED
    Store clause:           STORE USING (EMPLOYEE_ID)
                                 IN EMPIDS_LOW WITH LIMIT OF ('00200')
                                 IN EMPIDS_MID WITH LIMIT OF ('00400')
                                 OTHERWISE IN EMPIDS_OVER
                            Rename PARTITION SYS_P00076 TO IDS_LOW
                            Rename PARTITION SYS_P00077 TO IDS_MID
                            Rename PARTITION SYS_P00078 TO IDS_HIGH
    
    
    

    例5: 多数の記憶域にパーティション化された大規模な索引の作成

    まず、次のようにデータベース定義を作成します。


    SQL> CREATE INDEX ... MAINTENANCE IS ENABLED DEFERRED ...;
    

    次に、各パーティションをパラレル実行で構築するバッチ・ジョブをサブミットします。たとえば、バッチ・ジョブごとに次のようなスクリプトを実行します。


    ATTACH 'filename testdatabase';
    SET FLAGS 'index_stats';
    ALTER INDEX TRANSACTIONS_INDEX BUILD PARTITION PART_1;
    COMMIT;
    

    最後に、バッチ・ジョブの完了後、データベース管理者はメンテナンス・モードをENABLED IMMEDIATEに変更して、索引を問合せの使用に対してアクティブにする必要があります。ある手順が失敗した場合(考えられる理由は、リソースの制限や失敗したノード)、BUILD ALL PARTITIONS句を追加できます。


    SQL> SET FLAGS 'index_stats';
    SQL> SET TRANSLATION READ WRITE RESERVING...FOR EXCLUSIVE WRITES;
    SQL> ALTER INDEX ... BUILD ALL PARTITIONS;
    SQL> ALTER INDEX ... MAINTENANCE IS ENABLED IMMEDIATE;
    SQL> COMMIT;
    

    この体系は、CREATE INDEX文を直接発行することと比較して、いくつか利点があります。

    • 作成処理はパラレル実行でき、それによりリソースの使用率が向上し(読取りおよびソート対象の行数が減少する)、索引作成にかかる実行時間を短縮できます。

    • 処理されるパーティションは、全索引と比較すると小さいため、処理されるデータの量もより少なくなります。これにより、これらのトランザクションに関わる.rujファイルが小さくなり、AIJファイル領域も少なくなります。

    • パーティションの構築はそれぞれ別個のトランザクション内で実行され、失敗した手順がある場合に簡単に繰り返すことができるため、CREATE INDEX文全体を繰り返す必要がありません。

    • 失敗した手順がある場合、スクリプトに含まれるBUILD ALL PARTITIONS句によってもそれらの手順が繰り返されます。

    例6: 多数の記憶域にパーティション化された大規模な索引の削除

    まず、次のように索引を無効にします。


    SQL> ALTER INDEX TRANSACTIONS_INDEX MAINTENANCE IS DISABLED;
    

    次に、パーティションをパラレル実行で切り捨てるバッチ・ジョブをサブミットします。


    SQL> ALTER INDEX TRANSACTIONS_INDEX TRUNCATE PARTITION PART_1;
    SQL> COMMIT;
    

    最後に、バッチ・ジョブが完了した後、メタデータを削除します。


    SQL> DROP INDEX TRANSACTIONS_INDEX;
    

    この体系は、DROP INDEX文を直接発行することと比較して、いくつか利点があります。

    • 切捨て処理はパラレル実行でき、それによりリソースの使用率が向上し、索引削除にかかる実行時間を短縮できます。

    • 処理されるパーティションは、全索引と比較すると小さいため、処理されるデータの量もより少なくなります。これにより、これらのトランザクションに関わる.rujファイルが小さくなり、AIJファイル領域も少なくなります。

    • パーティションの切捨てはそれぞれ別個のトランザクション内で実行され、失敗した手順がある場合に簡単に繰り返すことができるため、処理全体を繰り返す必要がありません。

    • 失敗した手順がある場合、DROP INDEX文によってもそれらの手順が繰り返されます。

    例7: TRUNCATE PARTITION文の使用

    次の例は、MF_PERSONNELデータベースに対してTRUNCATE PARTITION文を使用する方法を示しています。


    SQL> show index (partition) EMPLOYEES_HASH
    Indexes on table EMPLOYEES:
    EMPLOYEES_HASH                  with column EMPLOYEE_ID
      No Duplicates allowed
      Type is Hashed Scattered
      Key suffix compression is DISABLED
    
     Partition information for index:
      Partition: (1) SYS_P00076
       Storage Area: EMPIDS_LOW
      Partition: (2) SYS_P00077
       Storage Area: EMPIDS_MID
      Partition: (3) SYS_P00078
       Storage Area: EMPIDS_OVER
    
    SQL> alter index employees_hash truncate partition SYS_P00077;
    %RDB-W-META_WARN, metadata successfully updated with the reported warning
    -RDMS-W-IDXBLDPEND, index in build pending state - maintenance is disabled
    SQL> insert into employees default values;
    %RDB-E-READ_ONLY_REL, relation EMPLOYEES was reserved for read access; updates
    not allowed
    -RDMS-F-BUILDPENDING, index in build pending state - operation not permitted
    

    索引の作成が完了するまで、問合せオプティマイザはそれを使用できず、索引の定義対象である表の更新も実行できません。SHOW INDEXコマンドは、この状態についてレポートします。


    SQL> show index employees_hash
    Indexes on table EMPLOYEES:
    EMPLOYEES_HASH                  with column EMPLOYEE_ID
      No Duplicates allowed
      Type is Hashed Scattered
      Key suffix compression is DISABLED
      Maintenance is Deferred - build pending
    


    ALTER MODULE文

    モジュールを変更してルーチンを追加または削除したり、コメントを変更したり、ストアド・ルーチンをコンパイルします。

    環境

    ALTER MODULE文は次の環境で使用できます。

    • 対話型SQL内

    • ホスト言語プログラムに埋め込まれる場合

    • SQLモジュールのプロシージャの一部として

    • 動的SQLで動的に実行される文として


    形式





    引数

    ADD routine-clause

    新規のファンクションおよびプロシージャをモジュールに追加できます。routine-clauseの詳細は、「CREATE MODULE文」を参照してください。ALTER MODULE句を終了し、文を明白に終了するには、END MODULE句を使用する必要があります。

    COMMENT IS 'string'

    モジュールに関するコメントを追加します。コメントは一重引用符(')で囲み、コメント内の複数の行はスラッシュ(/)で区切ります。この句は、COMMENT ON MODULE文と同義です。

    COMPILE

    モジュール内のストアド・ルーチンを再コンパイルします。コンパイルが成功すると、無効とマークされていたルーチンでは、このフラグがクリアされます。

    drop-routine-clause

    DROP FUNCTION句およびDROP PROCEDURE句は、このモジュールから名前付きルーチンを削除します。All DROP句は、このALTER文の中のCOMPILE句およびADD句の前に実行します。

    END MODULE

    複合文の終わりとALTER MODULE文の終わりを区別する方法がないため、ADD FUNCTIONまたはADD PROCEDUREを使用する場合は、この終了句が必要です。

    RENAME TO

    変更中のモジュール名を変更します。詳細は、「RENAME文」を参照してください。新規名がシノニム名である場合は、エラーが発生します。

    RENAME TO句には、このデータベースに対して有効なシノニムが必要です。「ALTER DATABASE文」のSYNONYMS ARE ENABLED句に関する説明を参照してください。これらのシノニムがデータベース定義またはアプリケーションによって使用されていない場合は、削除される可能性があります。

    このモジュールの新規名には、古い名前を使用してシノニムが作成されます。この名前がアプリケーションによって使用されなくなった場合は、このシノニムは削除できます。


    使用方法

    • 被参照モジュールに対するALTER権限が必要です。

    • ALTER MODULE文によって、名前付きモジュール用のRDB$MODULES表のRDB$LAST_ALTERED列がトランザクションのタイムスタンプで更新されます。


    例1: モジュールに関するコメントの変更

    この例で示すように、モジュールに関するコメントは、COMMENT IS句を使用して追加および変更できます。


    SQL> alter module EMPLOYEES_MAINTENANCE
    cont>     comment is
    cont>           'routines to add and remove employee rows'
    cont>     /     'Fix: also record the employees birthday';
    SQL>
    SQL> show module EMPLOYEES_MAINTENANCE;
    Information for module EMPLOYEES_MAINTENANCE
    
     Header:
     EMPLOYEES_MAINTENANCE
     Comment:       routines to add and remove employee rows
                    Fix: also record the employees birthday
     Module ID is: 7
    
     Routines in module EMPLOYEES_MAINTENANCE:
         ADD_EMPLOYEE
         IS_CURRENT_EMPLOYEE
         REMOVE_EMPLOYEE
    

    例2: モジュール内のすべてのルーチンの再検証

    COMPILE句を使用して、各ストアド・プロシージャまたはファンクションが実行可能かどうかをチェックできます。コンパイルが失敗すると、第1の理由がレポートされます。この例では、欠落している表が理由です。


    SQL> alter module EMPLOYEES_MAINTENANCE compile;
    %RDB-E-NO_META_UPDATE, metadata update failed
    -RDB-E-OBSOLETE_METADA, request references metadata objects that no longer exist
    -RDMS-F-BAD_SYM, unknown relation symbol - ARCHIVE_EMPLOYEES
    

    例3: モジュール内のルーチンの置換

    次の例では、簡単なモジュールを作成し、DROP TABLE...CASCADEの効果を示します。つまり、プロシージャREMOVE_EMPLOYEEが無効であるとマークされます。COMPILE句を使用してプロシージャを再検証しようとしますが、被参照表が存在していません。表の置換後、COMPILEは正常に完了します。


    SQL> set dialect 'sql99';
    SQL> attach 'file PERSONNEL1';
    SQL>
    SQL> create table EMPLOYEES
    cont>     (employee_id        integer,
    cont>      last_name          char(40),
    cont>      first_name         char(40),
    cont>      birthday           date,
    cont>      start_date         date default current_date);
    SQL>
    SQL> create table ARCHIVE_EMPLOYEES
    cont>     (employee_id        integer,
    cont>      last_name          char(40),
    cont>      first_name         char(40),
    cont>      archive_date       date default current_date);
    SQL>
    SQL> create module EMPLOYEES_MAINTENANCE
    cont>
    cont>     procedure REMOVE_EMPLOYEE (in :employee_id integer);
    cont>     begin
    cont>     -- take copy of the old row
    cont>     insert into ARCHIVE_EMPLOYEES
    cont>         (employee_id, last_name, first_name)
    cont>         select employee_id, last_name, first_name
    cont>         from EMPLOYEES
    cont>         where employee_id = :employee_id;
    cont>     -- remove the old row
    cont>     delete from EMPLOYEES
    cont>         where employee_id = :employee_id;
    cont>     end;
    cont>
    cont>     procedure ADD_EMPLOYEE
    cont>         (in :employee_id integer,
    cont>          in :last_name char(40),
    cont>          in :first_name char(40),
    cont>          in :birthday date);
    cont>     insert into EMPLOYEES
    cont>         (employee_id, last_name, first_name, birthday)
    cont>         values (:employee_id, :last_name, :first_name, :birthday);
    cont>
    cont> end module;
    SQL>
    SQL> show module EMPLOYEES_MAINTENANCE
    Information for module EMPLOYEES_MAINTENANCE
    
     Header:
     EMPLOYEES_MAINTENANCE
     Module ID is: 7
    
     Routines in module EMPLOYEES_MAINTENANCE:
         ADD_EMPLOYEE
         REMOVE_EMPLOYEE
    
    SQL>
    SQL> drop table ARCHIVE_EMPLOYEES cascade;
    SQL>
    SQL> show procedure REMOVE_EMPLOYEE;
    Information for procedure REMOVE_EMPLOYEE
    
    Current state is INVALID
            Can be revalidated
     Procedure ID is: 8
     Source:
     REMOVE_EMPLOYEE (in :employee_id integer);
        begin
        -- take copy of the old row
        insert into ARCHIVE_EMPLOYEES
            (employee_id, last_name, first_name)
            select employee_id, last_name, first_name
            from EMPLOYEES
            where employee_id = :employee_id;
        -- remove the old row
        delete from EMPLOYEES
            where employee_id = :employee_id;
        end
     No description found
     Module name is: EMPLOYEES_MAINTENANCE
     Module ID is: 7
     Number of parameters is: 1
    
    Parameter Name                  Data Type        Domain or Type
    --------------                  ---------        --------------
    EMPLOYEE_ID                     INTEGER
            Parameter position is 1
            Parameter is IN (read)
            Parameter is passed by reference
    
    SQL>
    SQL> -- COMPILE reports the missing table
    SQL> alter module EMPLOYEES_MAINTENANCE compile;
    %RDB-E-NO_META_UPDATE, metadata update failed
    -RDB-E-OBSOLETE_METADA, request references metadata objects that no longer exist
    -RDMS-F-BAD_SYM, unknown relation symbol - ARCHIVE_EMPLOYEES
    SQL>
    SQL> create table ARCHIVE_EMPLOYEES
    cont>     (employee_id        integer,
    cont>      last_name          char(40),
    cont>      first_name         char(40),
    cont>      birthday           date,
    cont>      archive_date       date default current_date);
    SQL>
    SQL> -- new table definition is compatible
    SQL> alter module EMPLOYEES_MAINTENANCE compile;
    SQL>
    SQL> alter module EMPLOYEES_MAINTENANCE
    cont>     comment is
    cont>           'routines to add and remove employee rows'
    cont>     /     'Fix: also record the employees birthday'
    cont>
    cont>     drop procedure REMOVE_EMPLOYEE if exists
    cont>
    cont>     add procedure REMOVE_EMPLOYEE (in :employee_id integer);
    cont>     begin
    cont>     -- take copy of the old row
    cont>     insert into ARCHIVE_EMPLOYEES
    cont>         (employee_id, last_name, first_name, birthday)
    cont>         select employee_id, last_name, first_name, birthday
    cont>         from EMPLOYEES
    cont>         where employee_id = :employee_id;
    cont>     -- remove the old row
    cont>     delete from EMPLOYEES
    cont>         where employee_id = :employee_id;
    cont>     end;
    cont> end module;
    SQL>
    SQL> show module EMPLOYEES_MAINTENANCE;
    Information for module EMPLOYEES_MAINTENANCE
    
     Header:
     EMPLOYEES_MAINTENANCE
     Comment:       routines to add and remove employee rows
                    Fix: also record the employees birthday
     Module ID is: 7
    
     Routines in module EMPLOYEES_MAINTENANCE:
         ADD_EMPLOYEE
         REMOVE_EMPLOYEE
    

    例4: モジュールへの新規のファンクションの追加

    次の例では、ADD句を使用して既存のモジュールに新規のファンクションを追加しています。


    SQL> alter module EMPLOYEES_MAINTENANCE
    cont>     add function IS_CURRENT_EMPLOYEE (in :employee_id integer)
    cont>         returns integer;
    cont>     return (case
    cont>             when exists (select *
    cont>                          from EMPLOYEES
    cont>                          where employee_id = :employee_id)
    cont>             then 1
    cont>             else 0
    cont>             end);
    cont> end module;
    SQL>
    SQL> show module EMPLOYEES_MAINTENANCE;
    Information for module EMPLOYEES_MAINTENANCE
    
     Header:
     EMPLOYEES_MAINTENANCE
     Comment:       routines to add and remove employee rows
                    Fix: also record the employees birthday
     Module ID is: 7
    
     Routines in module EMPLOYEES_MAINTENANCE:
         ADD_EMPLOYEE
         IS_CURRENT_EMPLOYEE
         REMOVE_EMPLOYEE
    


    ALTER OUTLINE文

    アウトライン定義を変更します。

    環境

    ALTER OUTLINE文は次の環境で使用できます。

    • 対話型SQL内

    • ホスト言語プログラムに埋め込まれる場合

    • SQLモジュールのプロシージャの一部として

    • 動的SQLで動的に実行される文として


    形式



    引数

    COMMENT IS string

    COMMENT IS句を使用して、問合せアウトラインとともに格納されているコメントを変更できます。COMMENT ON文は、ALTER OUTLINE...COMMENT IS句と同じ機能があります。

    この句は、COMMENT ONプロシージャと同義です。

    COMPILE

    COMPILEオプションは、DROP TABLEまたはDROP INDEXによって無効にされた問合せアウトラインに適用できます。表および索引が再作成された場合、問合せアウトラインは再有効化されます。たとえば、再有効化されると、オプティマイザがこの問合せアウトラインの使用を試みます。

    注意

    有効とマークされた問合せアウトラインが、索引定義が変更されているために使用されない可能性があります。問合せアウトラインとともに格納された情報が少なすぎるため、完全な整合性チェックを実行できません。可能であれば、このアウトラインを使用する問合せを実行して、正しい索引および表の使用方法を検証する必要があります。

    問合せアウトラインが現在有効な場合、この句はOracle Rdbによって無視されます。

    MOVE TO

    MOVE TOは、マルチスキーマ・データベースに対してのみ有効です。MULTISCHEMA IS ON句によって明示的または暗黙的にアタッチされる必要があります。MOVE TO句を使用して、問合せアウトラインを他のカタログやスキーマに移動できます。この句がマルチスキーマ環境以外で指定されると、エラーが発生します。

    ターゲットのカタログおよびスキーマは、このデータベース内に存在する必要があります。

    RENAME TO

    RENAME TO句を使用して、アウトライン名を変更できます。新規名は、データベースにすでに存在するもの以外にする必要があります。

    RENAME TOが、MULTISCHEMA IS ONを使用してアタッチされ、マルチスキーマ・データベース内で使用されている場合、マルチスキーマ名のみが変更され、オブジェクトのSTORED NAMEは変更されません。問合せアウトラインのSTORED NAMEを変更するには、MULTISCHEMA IS OFF句を使用して明示的にデータベースにアタッチする必要があります(次の例を参照)。Oracle Rdbによって問合せアウトラインのSTORED NAMEが生成されている場合があります。

    注意

    この新規アウトライン名を参照するには、OPTIMIZE USING句を使用するすべての問合せも変更する必要があります。


    使用方法

    • この文を実行するには、データベースに対するALTER権限が必要です。

    • アウトライン名には、接頭辞としてデータベースの別名を付けることができます。次に例を示します。


      SQL> attach 'ALIAS db1 FILENAME mschema_db';
      SQL> alter outline db1.SHOW_TABLES_QUERY
      cont>     comment is 'used to select SHOW_TAB_INDEX_01';
      


      マルチスキーマ・データベースでは、名前にスキーマ名とカタログ名を含めることもできます。


    例1: 問合せアウトラインに関するコメントの変更


    SQL> alter outline show_tables
    cont>     comment is  'show the tables query'
    cont>     /           'derived from a stored procedure';
    SQL> show outline show_tables
         SHOW_TABLES
     Comment:       show the tables query
                    derived from a stored procedure
     Source:
    -- Rdb Generated Outline :  8-FEB-2002 16:17
    create outline SHOW_TABLES
    id '4D5B5CC5B46C6DD21B0E1999C0EB8BF3'
    mode 0
    as (
      query (
    -- For loop
        subquery (
          RDB$RELATIONS 0         access path index       RDB$REL_REL_NAME_NDX
          )
        )
      )
    compliance optional     ;
    

    例2: alternate COMMENT ON構文を使用したコメントの変更


    SQL> comment on outline show_tables
    cont>     is  'show the tables query'
    cont>     /   'derived from the stored procedure'
    cont>     /   'SHOW_TABLES';
    

    例3: 問合せアウトラインの名前の変更


    SQL> alter outline show_tables
    cont>     rename to show_the_tables;
    SQL> show outline show_the_tables
         SHOW_THE_TABLES
     Comment:       show the tables query
                    derived from the stored procedure
                    testing new COMMENT ON OUTLINE
     Source:
    -- Rdb Generated Outline :  8-FEB-2002 16:17
    create outline SHOW_THE_TABLES
    id '4D5B5CC5B46C6DD21B0E1999C0EB8BF3'
    mode 0
    as (
      query (
    -- For loop
        subquery (
          RDB$RELATIONS 0         access path index       RDB$REL_REL_NAME_NDX
          )
        )
      )
    compliance optional     ;
    

    例4: DROP INDEX後に有効な問合せアウトラインの設定

    まず、定義されたSTRATEGYフラグを使用してストアド・プロシージャが実行され、MY_OUTLINEという名前の問合せアウトラインが使用されていることが表示されます。


    SQL> set flags 'strategy';
    SQL> call my_procedure();
    ~S: Outline "MY_OUTLINE" used
    Aggregate       Conjunct        Index only retrieval of relation MY_TABLE
      Index name  MY_INDEX [1:1]
    

    次に、問合せが使用した(問合せアウトラインによって参照された)索引が削除されます。これにより、問合せアウトラインが無効に設定されます(WARN_INVALIDフラグを使用して表示される)。これで、ストアド・プロシージャを実行すると、問合せにより順次アクセス計画が使用されるようになりました。


    SQL> set flags 'warn_invalid';
    SQL> drop index my_index;
    ~Xw: Outline "MY_OUTLINE" marked invalid (index "MY_INDEX" dropped)
    SQL>
    SQL> set flags 'strategy';
    SQL> call my_procedure();
    ~S: Outline "MY_OUTLINE" is invalid and can not be used
    Aggregate       Conjunct        Get
    Retrieval sequentially of relation MY_TABLE
    SQL> show outline my_outline
         MY_OUTLINE
        Outline has been marked invalid
       .
       .
       .
    

    ALTER OUTLINE ...COMPILE句は、アウトラインを有効にするために使用されます。最初の試行により、索引が欠落していることがレポートされます。索引が再作成されると、COMPILEが成功します。これで、ストアド・プロシージャをコールすると、この問合せアウトラインが使用されるようになりました。


    SQL> alter outline my_outline compile;
    %RDB-E-NO_META_UPDATE, metadata update failed
    -RDMS-F-INDNOTEXI, index MY_INDEX does not exist in this database
    SQL> -- must redefine the index
    SQL> create index my_index on my_table (b desc);
    SQL> alter outline my_outline compile;
    SQL> call my_procedure();
    ~S: Outline "MY_OUTLINE" used
    Aggregate       Conjunct        Index only retrieval of relation MY_TABLE
      Index name  MY_INDEX [1:1]
    SQL>