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演算子および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文は次の環境で使用できます。
- 対話型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文は次の環境で使用できます。
- 対話型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>