SQL> SET FLAGS 'EXECUTION(1000)'; SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: PREFIX,EXECUTION(1000) |
キーワードと丸カッコで囲んだ数値の間には空白を使用できません。
$ define RDMS$SET_FLAGS "database_parameters" $ sql$ SQL> Attach 'File db$:scratch'; ATTACH #1, Database DISK:[DOCS.V71]SCRATCH.RDB;1 ~P Database Parameter Buffer (version=2, len=79) 0000 (00000) RDB$K_DPB_VERSION2 0001 (00001) RDB$K_FACILITY_ALL 0002 (00002) RDB$K_DPB2_IMAGE_NAME "NODE::DISK:[DIR]SQL$70.EXE;1" 0040 (00064) RDB$K_FACILITY_ALL 0041 (00065) RDB$K_DPB2_DBKEY_SCOPE (Transaction) 0045 (00069) RDB$K_FACILITY_ALL 0046 (00070) RDB$K_DPB2_REQUEST_SCOPE (Attach) 004A (00074) RDB$K_FACILITY_RDB_VMS 004B (00075) RDB$K_DPB2_CDD_MAINTAINED (No) RDMS$BIND_WORK_FILE = "DISK:[DIR]RDMSTTBL$UEOU3LQ0RV2.TMP;" (Visible = 0) SQL> Exit DETACH #1 |
$ DEFINE RDMS$SET_FLAGS "SEQ_CACHE(10000)" $ RMU/LOAD/COMMIT_EVERY=50000 DATABASE TABLE FILE |
この例では、SEQUENCE.NEXTVALが実行されるようにAUTOMATIC列が定義されているとみなされます。
SQL> set flags 'alt(lit)'; SQL> create outline o1 from (select * from employees where employee_id = '1'); SQL> set flags 'strat'; SQL> select * from employees where employee_id = '1'; ~S: Outline "O1" used Get Retrieval by index of relation EMPLOYEES Index name EMP_EMPLOYEE_ID [1:1] Direct lookup 0 rows selected SQL> select * from employees where employee_id = 'AAAAAA'; ~S: Outline "O1" used Conjunct Get Retrieval by index of relation EMPLOYEES Index name EMP_EMPLOYEE_ID [1:1] Direct lookup 0 rows selected |
ALTERNATE_OUTLINE_IDフラグが設定されていない場合、アウトラインは完全な問合せを使用して作成されます。
例1: データベース・システムのデバッグ・フラグの有効化および無効化
SQL> ATTACH 'FILENAME MF_PERSONNEL'; SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: PREFIX SQL> SQL> SET FLAGS 'TRACE'; SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: PREFIX,TRACE SQL> SQL> SET FLAGS 'STRATEGY'; SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: STRATEGY,PREFIX,TRACE SQL> SQL> SET FLAGS 'NOTRACE'; SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: STRATEGY,PREFIX SQL> SQL> SET NOFLAGS; SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: PREFIX SQL>
例2: PREFIXキーワードの使用
SQL> ATTACH 'FILENAME mf_personnel'; SQL> -- SQL> -- Show that the PREFIX keyword is enabled by default SQL> -- SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: PREFIX SQL> -- SQL> -- Enable TRACE SQL> -- SQL> SET FLAGS 'TRACE'; SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: PREFIX,TRACE SQL> -- SQL> -- Show that the prefix is displayed SQL> -- SQL> BEGIN cont> TRACE 'AAA'; cont> END; ~Xt: AAA SQL> -- SQL> -- Turn off the prefix SQL> -- SQL> SET FLAGS 'NOPREFIX'; SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: TRACE SQL> -- SQL> -- Show that the prefix is no longer displayed SQL> -- SQL> BEGIN cont> TRACE 'AAA'; cont> END; AAA
例3: 対話型SQLでのホスト変数の使用
この例も、複数のオプションとともにリテラル文字列を使用してフラグを有効化または無効化する方法を示しています。
SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: PREFIX SQL> -- declare a host variable to be used with SET FLAGS SQL> declare :hv char(40); SQL> -- assign a value to the variable SQL> begin cont> set :hv = 'strategy, outline'; cont> end; SQL> -- use the host variable to enable or disable flags SQL> set flags :hv; SQL> show flags Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: STRATEGY,PREFIX,OUTLINE SQL> -- use a string literal directly with the SET FLAGS statement SQL> set flags 'noprefix,execution(10)'; SQL> show flags Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: STRATEGY,OUTLINE,EXECUTION(10)
例4: MODE(n)フラグの使用
SQL> SET FLAGS 'MODE(10), OUTLINE'; SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: PREFIX,OUTLINE,MODE(10) SQL> SELECT COUNT(*) FROM EMPLOYEES; -- Rdb Generated Outline : 30-MAY-1997 16:35 create outline QO_B3F54F772CC05435_0000000A id 'B3F54F772CC054350B2B454D95537995' mode 10 as ( query ( -- For loop subquery ( subquery ( EMPLOYEES 0 access path index EMP_EMPLOYEE_ID ) ) ) ) compliance optional ; 100 1 row selected
例5: WARN_INVALIDデバッグ・フラグの使用
SQL> SET FLAGS 'WARN_INVALID'; SQL> SHOW FLAGS; Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: PREFIX,WARN_INVALID SQL> -- warning because of dependencies SQL> DROP TABLE T1 CASCADE; ~Xw: Routine "P3" marked invalid ~Xw: Routine "P2" marked invalid ~Xw: Routine "P1" marked invalid SQL> SQL> -- Create an outline that references an INDEX. SQL> CREATE TABLE T1 (A INTEGER, B INTEGER); SQL> CREATE INDEX I1 ON T1 (A); SQL> CREATE OUTLINE QO1 cont> ID '19412AB61A7FE1FA6053F43F8F01EE6D' cont> MODE 0 cont> AS ( cont> QUERY ( cont> SUBQUERY ( cont> T1 0 ACCESS PATH INDEX I1 cont> ) cont> ) cont> ) cont> COMPLIANCE OPTIONAL; SQL> SQL> -- Warning because of disabled index SQL> ALTER INDEX I1 cont> MAINTENANCE IS DISABLED; ~Xw: Outline "QO1" marked invalid (index "I1" disabled) SQL> SHOW OUTLINE QO1; QO1 Object has been marked INVALID Source: CREATE OUTLINE QO1 ID '19412AB61A7FE1FA6053F43F8F01EE6D' MODE 0 AS ( QUERY ( SUBQUERY ( T1 0 ACCESS PATH INDEX I1 ) ) ) COMPLIANCE OPTIONAL;
例6: INTERNALキーワードの使用によるトリガー・アクションの表示
SQL> -- The following code shows the strategy used by the trigger SQL> -- actions on the AFTER DELETE trigger on EMPLOYEES SQL> SET FLAGS 'STRATEGY, INTERNALS, REQUEST_NAMES'; SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: INTERNALS,STRATEGY,PREFIX,REQUEST_NAMES SQL> DELETE FROM EMPLOYEES WHERE EMPLOYEE_ID = '00164'; ~S: Trigger name EMPLOYEE_ID_CASCADE_DELETE Get Temporary relation Retrieval by index of relation DEGREES Index name DEG_EMP_ID [1:1] ~S: Trigger name EMPLOYEE_ID_CASCADE_DELETE Get Temporary relation Retrieval by index of relation JOB_HISTORY Index name JOB_HISTORY_HASH [1:1] ~S: Trigger name EMPLOYEE_ID_CASCADE_DELETE Get Temporary relation Retrieval by index of relation SALARY_HISTORY Index name SH_EMPLOYEE_ID [1:1] ~S: Trigger name EMPLOYEE_ID_CASCADE_DELETE Conjunct Get Retrieval by index of relation DEPARTMENTS Index name DEPARTMENTS_INDEX [0:0] Temporary relation Get Retrieval by index of relation EMPLOYEES Index name EMPLOYEES_HASH [1:1] Direct lookup 1 row deleted
例7: INDEX_COLUMN_GROUPキーワードの使用
SQL> -- The table STUDENTS has an index on the two columns SQL> -- STU_NUM and COURSE_NUM. When the INDEX_COLUMN_GROUP SQL> -- keyword is not set, the optimizer uses a fixed SQL> -- proportion of the table cardinality based on the equality SQL> -- with the STU_NUM column. In this example, 5134 rows are expected, SQL> -- when in reality, only 9 are returned by the query. SQL> CREATE INDEX STUDENT_NDX ON STUDENTS (STU_NUM,COURSE_NUM DESC); SQL> -- SQL> SELECT STU_NUM FROM STUDENTS cont> WHERE STU_NUM = 191270771 cont> ORDER BY OTHER_COLUMN; Solutions tried 2 Solutions blocks created 1 Created solutions pruned 0 Cost of the chosen solution 4.5644922E+03 Cardinality of chosen solution 5.1342500E+03 ~O: Physical statistics used Sort SortId# 7., # Keys 2 Item# 1, Dtype: 2, Order: 0, Off: 0, Len: 1 Item# 2, Dtype: 35, Order: 0, Off: 1, Len: 8 LRL: 32, NoDups:0, Blks:327, EqlKey:0, WkFls: 2 Leaf#01 BgrOnly STUDENTS Card=164296 BgrNdx1 STUDENT_NDX [1:1] Fan=14 191270771 191270771 191270771 191270771 191270771 191270771 191270771 191270771 SORT(9) SortId# 7, --------------------- Version: V5-000 Records Input: 9 Sorted: 9 Output: 0 LogRecLen Input: 32 Intern: 32 Output: 32 Nodes in SoTree: 5234 Init Dispersion Runs: 0 Max Merge Order: 0 Numb.of Merge passes: 0 Work File Alloc: 0 MBC for Input: 0 MBC for Output: 0 MBF for Input: 0 MBF for Output: 0 Big Allocated Chunk: 4606464 busy 191270771 9 rows selected SQL> -- SQL> -- When you use the SET FLAGS statement to set the SQL> -- INDEX_COLUMN_GROUP keyword, it activates the optimizer SQL> -- to consider the index segment columns as a workload column SQL> -- group, compute the statistics for duplicity factor and null SQL> -- factor dynamically, and then apply them in estimating the SQL> -- cardinality of the solution. SQL> -- SQL> SET FLAGS 'INDEX_COLUMN_GROUP'; SQL> -- The following is the optimizer cost estimate and sort output trace SQL> -- for the previous query with INDEX_COLUMN_GROUP enabled. The optimizer SQL> -- now estimates a lower cardinality of about 8 rows. Solutions tried 2 Solutions blocks created 1 Created solutions pruned 0 Cost of the chosen solution 3.8118614E+01 Cardinality of chosen solution 8.3961573E+00 ~O: Workload and Physical statistics used Sort SortId# 2., # Keys 2 Item# 1, Dtype: 2, Order: 0, Off: 0, Len: 1 Item# 2, Dtype: 35, Order: 0, Off: 1, Len: 8 LRL: 32, NoDups:0, Blks:7, EqlKey:0, WkFls: 2 Leaf#01 BgrOnly STUDENTS Card=164296 BgrNdx1 STUDENT_NDX [1:1] Fan=14 191270771 191270771 191270771 191270771 191270771 191270771 191270771 191270771 SORT(2) SortId# 2, --------------------- Version: V5-000 Records Input: 9 Sorted: 9 Output: 0 LogRecLen Input: 32 Intern: 32 Output: 32 Nodes in SoTree: 114 Init Dispersion Runs: 0 Max Merge Order: 0 Numb.of Merge passes: 0 Work File Alloc: 0 MBC for Input: 0 MBC for Output: 0 MBF for Input: 0 MBF for Output: 0 Big Allocated Chunk: 87552 idle 191270771 9 rows selected
例8: AUTO_OVERRIDEキーワードの使用
SQL> -- Suppose that after year 2000 testing was performed on a SQL> -- production system, the system date and time were not reset SQL> -- to the correct date. This was not noticed until SQL> -- after transactions for a full day had been stored. To SQL> -- correct this problem, the database administrator overrides SQL> -- the READ ONLY characteristic of the AUTOMATIC column and SQL> -- adjusts the date and time. SQL> SELECT * FROM ACCOUNTS cont> WHERE LAST_UPDATE > DATE'2001-1-1'; ACCOUNT_NO LAST_NAME LAST_UPDATE CURRENT_BALANCE NULL Smith 2001-06-02 100000.000 1 row selected SQL> -- Attempts to fix the date and time fail because the SQL> -- column is AUTOMATIC. SQL> UPDATE ACCOUNTS cont> SET LAST_UPDATE = LAST_UPDATE - INTERVAL'1' YEAR cont> WHERE LAST_UPDATE > DATE'2000-1-1'; %RDB-E-READ_ONLY_FIELD, attempt to update the read-only field LAST_UPDATE SQL> -- SQL> SET FLAGS 'AUTO_OVERRIDE'; SQL> SHOW FLAGS Alias RDB$DBHANDLE: Flags currently set for Oracle Rdb: PREFIX,AUTO_OVERRIDE SQL>-- SQL> -- Fix the date and time. SQL> UPDATE ACCOUNTS cont> SET LAST_UPDATE = LAST_UPDATE - INTERVAL'1' YEAR cont> WHERE LAST_UPDATE > DATE'2000-1-1'; 1 row updated SQL> SQL> SELECT * FROM ACCOUNTS; ACCOUNT_NO LAST_NAME LAST_UPDATE CURRENT_BALANCE NULL Smith 1999-06-02 100000.000 1 row selected SQL> SQL> SET FLAGS 'NOAUTO_OVERRIDE';
例9: AUTO_INDEXオプションの使用
SQL> set dialect 'SQL92'; SQL> set flags 'AUTO_INDEX,INDEX_STATS'; SQL> create table PERSON cont> (employee_id integer primary key, cont> manager_id integer references PERSON (employee_id), cont> last_name char(30), cont> first_name char(30), cont> unique (last_name, first_name)); ~Ai create index "PERSON_PRIMARY_EMPLOYEE_ID" ~Ai larea length is 430 ~Ai storage area (default) larea=57 ~Ai create sorted index, ikey_len=5 Sort Get Retrieval sequentially of relation PERSON ~Ai create index partition, node=430 %fill=0 ~Ai create index "PERSON_FOREIGN1" ~Ai larea length is 215 ~Ai storage area is shared: larea=57 ~Ai create sorted index, ikey_len=5 Sort Get Retrieval sequentially of relation PERSON ~Ai create index partition, node=0 %fill=0 ~Ai create index "PERSON_UNIQUE1" ~Ai larea length is 215 ~Ai storage area is shared: larea=57 ~Ai create sorted index, ikey_len=62 Sort Get Retrieval sequentially of relation PERSON ~Ai create index partition, node=0 %fill=0 SQL> SQL> show table (index) person Information for table PERSON Indexes on table PERSON: PERSON_FOREIGN1 with column MANAGER_ID Duplicates are allowed Type is Sorted Key suffix compression is DISABLED PERSON_PRIMARY_EMPLOYEE_ID with column EMPLOYEE_ID No Duplicates allowed Type is Sorted Key suffix compression is DISABLED Node size 430 PERSON_UNIQUE1 with column LAST_NAME and column FIRST_NAME Duplicates are allowed Type is Sorted Key suffix compression is DISABLED SQL>
例10: WATCH_CALLオプションの使用
この例は、INSERT文に対するWATCH_CALLの出力を示しています。これにより、AFTER INSERTトリガー(AFTER_INSERT)が実行され、SQLファンクションWRITE_TEXTがコールされ、入力データがトレースされています。次に、OPTIMIZE AS句を使用して名前が付けられた問合せがトレースされています。
SQL> insert into SAMPLE_T values ('Fred'); ~Xa: routine "(unnamed)", user=SMITH ~Xa: routine "AFTER_INSERT", user=SMITH ~Xa: routine "WRITE_TEXT", user=SMITH ~Xt: Fred 1 row inserted SQL> select * from SAMPLE_T cont> optimize as LOOKUP_SAMPLE_T; ~Xa: routine "LOOKUP_SAMPLE_T", user=SMITH NEW_NAME Fred 1 row selected
例11: WATCH_OPENオプションの使用
この例は、例10と同じINSERT文に対するWATCH_OPENの出力を示しています。
SQL> insert into SAMPLE_T values ('Fred'); ~Xo: Start Request B667E51E3625026EB7FFF3F4D3A16DC3 (unnamed) ~Xo: Start Request A8568053FE5A1A0852A1BE83A884016F "AFTER_INSERT" (query) ~Xo: Start Request 08AE59062657299B4768F6C2DFB6928E "WRITE_TEXT" (stored) ~Xt: Fred 1 row inserted SQL> SQL> select * from SAMPLE_T cont> optimize as LOOKUP_SAMPLE_T; ~Xo: Start Request F6025FAB1DD36B0DE0E52F3A9641BC5F "LOOKUP_SAMPLE_T" (query) NEW_NAME Fred Fred 2 rows selected
例12: アプリケーション・プログラムからのSET FLAGSの使用
SET FLAGS文は、次の2つのいずれかの方法を使用して動的SQLから実行できます。
- 1つ目は、文字列リテラルを渡して直接実行する方法です。SET FLAGSの文字列リテラル引数をEXECUTE IMMEDIATEの文字列リテラル引数に正しく組み込むには、一重引用符を二重にする必要があります。
- 2つ目は、SET FLAGS文全体をEXECUTE IMMEDIATEのパラメータに渡す方法です。
exec sql execute immediate 'set flags ''strategy''';
SET FLAGS文全体をEXECUTE IMMEDIATEのパラメータに組み込むことができます。
exec sql execute immediate :set_flags_text;
SET FLAGSを複数回実行する場合、これを動的文(PREPARE)として準備し、複数回実行するためにこの文の名前を使用できます。入力マーカー(?)は、前に準備された文を実行するために各コールで代用されます。
#include <string.h> #include <sql_rdb_headers.h> void main () { int SQLCODE; char myflags[40]; exec sql prepare set_flags_stmt from 'set flags ?'; if (SQLCODE != 0) sql_signal (); strcpy (myflags, "transaction,item_list"); exec sql execute set_flags_stmt using :myflags; if (SQLCODE != 0) sql_signal (); exec sql start transaction; if (SQLCODE != 0) sql_signal (); strcpy (myflags, "notransaction,noitem_list"); exec sql execute set_flags_stmt using :myflags; if (SQLCODE != 0) sql_signal (); exec sql rollback; if (SQLCODE != 0) sql_signal (); }
例13: CHRONO_FLAGオプションの使用
SQL> set flags 'chrono_fla(2),transaction'; SQL> start transaction; ATTACH #1, 29-NOV-2003 10:08:37.51 ~T Compile transaction (1) on db: 1 ~T Transaction Parameter Block: (len=2) 0000 (00000) TPB$K_VERSION = 1 0001 (00001) TPB$K_WRITE (read write) ATTACH #1, 29-NOV-2003 10:08:37.58 ~T Start_transaction (1) on db: 1, db count=1 SQL> rollback; ATTACH #1, 29-NOV-2003 10:08:46.74 ~T Rollback_transaction (1) on db: 1 SQL> rollback; ATTACH #1, 29-NOV-2003 10:08:46.74 ~T Rollback_transaction (1) on db: 1 SQL>
例14: REBUILD_SPAM_PAGESオプションの使用
表または索引の行の長さまたはTHRESHOLDS句を変更する場合、論理領域の対応するSPAMページの再構成が必要な場合があります。デフォルトでは、これらのDDLコマンドによりAIPが更新され、SPAMページの再構成が必要であることを示すフラグが設定されます。ただし、このフラグは、トランザクションに対してCOMMITを実行する前に設定できます。これにより、再構成はこのトランザクション内で行われます。
次の例は、EMPLOYEES表の簡単な変更を示しています(この例では、一連のUNIFORM領域にマップされています)。フラグSTOMAP_STATSを使用して、ALTER文およびCOMMIT文からより多くの情報をトレースできるようにしています。
SQL> set transaction read write; SQL> SQL> set flags 'stomap_stats'; SQL> SQL> alter table EMPLOYEES cont> add column MANAGERS_COMMENTS varchar(300); ~As: reads: async 0 synch 94, writes: async 18 synch 1 SQL> SQL> alter storage map EMPLOYEES_MAP cont> store cont> using (EMPLOYEE_ID) cont> in EMPIDS_LOW cont> (thresholds (34,76,90)) cont> with limit of ('00200') cont> in EMPIDS_MID cont> (thresholds (34,76,90)) cont> with limit of ('00400') cont> otherwise in EMPIDS_OVER cont> (thresholds (34,76,90)); ~As locking table "EMPLOYEES" (PR -> PU) ~As: removing superseded routine EMPLOYEES_MAP ~As: creating storage mapping routine EMPLOYEES_MAP (columns=1) ~As: reads: async 0 synch 117, writes: async 56 synch 0 SQL> SQL> set flags 'rebuild_spam_pages'; SQL> SQL> commit; %RDMS-I-LOGMODVAL, modified record length to 423 %RDMS-I-LOGMODVAL, modified space management thresholds to (34%, 76%, 90%) %RDMS-I-LOGMODVAL, modified record length to 423 %RDMS-I-LOGMODVAL, modified space management thresholds to (34%, 76%, 90%) %RDMS-I-LOGMODVAL, modified record length to 423 %RDMS-I-LOGMODVAL, modified space management thresholds to (34%, 76%, 90%) SQL>
メッセージLOGMODVALは、パーティションごとに1つずつ、記憶域マップの各論理領域に対して表示されます。
この再構成アクションはUNIFORM記憶域に対してのみ適用されます。また、SPAMページを再構成するためにSPAMページおよびデータ・ページが読み取られるため、多大なI/Oが生じる可能性があります。