sqllib/misc/の下にexplain.ddlが入っている。 コネクトする。 E:\Sss2003\DeadLock>db2 connect to zeus2_07 user sss using sss データベース接続情報 データベース・サーバー = DB2/NT 8.1.0 SQL 許可 ID = SSS ローカル・データベース別名 = ZEUS2_07 explain.ddlを流す。 E:\Sss2003\DeadLock>db2 -tvf explain.ddl ******* IMPORTANT ********** USAGE: db2 -tf EXPLAIN.DDL ******* IMPORTANT ********** UPDATE COMMAND OPTIONS USING C OFF DB20000I UPDATE COMMAND OPTIONS コマンドが正常に終了しました。 CREATE TABLE EXPLAIN_INSTANCE ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL, EXPLAIN _TIME TIMESTAMP NOT NULL, SOURCE_NAME VARCHAR(128) NOT NULL, SOURC E_SCHEMA VARCHAR(128) NOT NULL, SOURCE_VERSION VARCHAR(64) NOT NULL, EXP LAIN_OPTION CHAR(1) NOT NULL, SNAPSHOT_TAKEN CHAR(1) NOT NULL, DB2_ VERSION CHAR(7) NOT NULL, SQL_TYPE CHAR(1) NOT NULL, QUERYOPT INTEGER NOT NULL, BLOCK CHAR(1) NOT NULL, ISOLATION CHAR(2) NOT NULL, BUFFPAGE INTEGER NOT NULL, AVG_APPLS INTEGER NOT NULL, SORTHEAP INTEGER NOT NULL, LOCKLIST IN TEGER NOT NULL, MAXLOCKS SMALLINT NOT NULL, LOCKS_AVAIL INTEGE R NOT NULL, CPU_SPEED DOUBLE NOT NULL, REMARKS VARCHAR(25 4), DBHEAP INTEGER NOT NULL, COMM_SPEED DOUBLE NOT NULL, PARALLELISM CHAR(2) NOT NULL, DATAJOINER CHAR(1) NOT NULL, PRIM ARY KEY (EXPLAIN_REQUESTER, EXPLAIN_TIME, SOURCE_NAME, SOURCE_SCHEMA, SOURCE_VER SION)) DB20000I SQL コマンドが正常に終了しました。 CREATE TABLE EXPLAIN_STATEMENT ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL, EXPLAI N_TIME TIMESTAMP NOT NULL, SOURCE_NAME VARCHAR(128) NOT NULL, SOUR CE_SCHEMA VARCHAR(128) NOT NULL, SOURCE_VERSION VARCHAR(64) NOT NULL, EX PLAIN_LEVEL CHAR(1) NOT NULL, STMTNO INTEGER NOT NULL, SECTNO INTEGER NOT NULL, QUERYNO INTEGER NOT NULL , QUERYTAG CHAR(20) NOT NULL, STATEMENT_TYPE CHAR(2) NOT NU LL, UPDATABLE CHAR(1) NOT NULL, DELETABLE CHAR(1) NOT NULL, TOTAL_COST DOUBLE NOT NULL, STATEMENT_TEXT CLOB(2M) NO T NULL NOT LOGGED, SNAPSHOT BLOB(10M) NOT LOGGED, QUERY_DEGREE INTEGER NOT NULL, PRIMARY KEY (EXPLAIN_REQUESTER, EXPLAIN_TIME, SOURCE_NAME , SOURCE_SCHEMA, SOURCE_VERSION, EXPLAIN_LEVEL, STMTNO, SECTNO), FOREIGN KEY (EX PLAIN_REQUESTER, EXPLAIN_TIME, SOURCE_NAME, SOURCE_SCHEMA, SOURCE_VERSION) REFER ENCES EXPLAIN_INSTANCE ON DELETE CASCADE) DB20000I SQL コマンドが正常に終了しました。 CREATE TABLE EXPLAIN_ARGUMENT ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL, EXPL AIN_TIME TIMESTAMP NOT NULL, SOURCE_NAME VARCHAR(128) NOT NU LL, SOURCE_SCHEMA VARCHAR(128) NOT NULL, SOURCE_VERSION VARCHAR(64) NOT NULL, EXPLAIN_LEVEL CHAR(1) NOT NULL, STMTNO INTE GER NOT NULL, SECTNO INTEGER NOT NULL, OPERATOR_ID INTEGER NOT NULL, ARGUMENT_TYPE CHAR(8) NOT NULL, ARGUMENT _VALUE VARCHAR(1024), LONG_ARGUMENT_VALUE CLOB(2M) NOT LOGGED, FOREIGN KEY (EXPLAIN_REQUESTER, EXPLAIN_TIME, SOURCE_NAME, SOURCE_SCHEMA, SOURCE_VERSIO N, EXPLAIN_LEVEL, STMTNO, SECTNO) REFERENCES EXPLAIN_STATEMENT ON DELETE CASCADE ) DB20000I SQL コマンドが正常に終了しました。 CREATE TABLE EXPLAIN_OBJECT ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL, EXPLAI N_TIME TIMESTAMP NOT NULL, SOURCE_NAME VARCHAR(128) NOT NULL , SOURCE_SCHEMA VARCHAR(128) NOT NULL, SOURCE_VERSION VARCHAR(64) NOT NULL, EXPLAIN_LEVEL CHAR(1) NOT NULL, STMTNO INTEG ER NOT NULL, SECTNO INTEGER NOT NULL, OBJECT_SCHEMA VARCHAR(128) NOT NULL, OBJECT_NAME VARCHAR(128) NOT NULL, OBJECT_TYP E CHAR(2) NOT NULL, CREATE_TIME TIMESTAMP, STATISTICS_TIM E TIMESTAMP, COLUMN_COUNT SMALLINT NOT NULL, ROW_COUNT BIGINT NOT NULL, WIDTH INTEGER NOT NULL, PAGES INTEGER NOT NULL, DISTINCT CHAR(1) NOT NULL, TA BLESPACE_NAME VARCHAR(128), OVERHEAD DOUBLE NOT NULL, TRA NSFER_RATE DOUBLE NOT NULL, PREFETCHSIZE INTEGER NOT N ULL, EXTENTSIZE INTEGER NOT NULL, CLUSTER DOUBLE NOT NULL, NLEAF INTEGER NOT NULL, NLEVELS IN TEGER NOT NULL, FULLKEYCARD BIGINT NOT NULL, OVERFLOW INTEGER NOT NULL, FIRSTKEYCARD BIGINT NOT NULL, FIRST2K EYCARD BIGINT NOT NULL, FIRST3KEYCARD BIGINT NOT NULL, FIRST4KEYCARD BIGINT NOT NULL, SEQUENTIAL_PAGES INTEGER N OT NULL, DENSITY INTEGER NOT NULL, STATS_SRC CHAR(1 ) NOT NULL, AVERAGE_SEQUENCE_GAP DOUBLE NOT NULL, AVERAGE_SEQUENC E_FETCH_GAP DOUBLE NOT NULL, AVERAGE_SEQUENCE_PAGES DOUBLE NOT NULL, AVERAGE_SEQUENCE_FETCH_PAGES DOUBLE NOT NULL, AVERAGE_RANDOM_PAGES D OUBLE NOT NULL, AVERAGE_RANDOM_FETCH_PAGES DOUBLE NOT NULL, NUMRIDS BIGINT NOT NULL, NUMRIDS_DELETED BIGINT NOT NULL, NUM_EMPTY_LEAFS BIGINT NOT NULL, ACTIVE_BLOCKS B IGINT NOT NULL, FOREIGN KEY (EXPLAIN_REQUESTER, EXPLAIN_TIME, SOURCE_NAME, SOUR CE_SCHEMA, SOURCE_VERSION, EXPLAIN_LEVEL, STMTNO, SECTNO) REFERENCES EXPLAIN_STA TEMENT ON DELETE CASCADE) DB20000I SQL コマンドが正常に終了しました。 CREATE TABLE EXPLAIN_OPERATOR ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL, EXPLAIN _TIME TIMESTAMP NOT NULL, SOURCE_NAME VARCHAR(128) NOT NULL, SOURC E_SCHEMA VARCHAR(128) NOT NULL, SOURCE_VERSION VARCHAR(64) NOT NULL, EXP LAIN_LEVEL CHAR(1) NOT NULL, STMTNO INTEGER NOT NULL, S ECTNO INTEGER NOT NULL, OPERATOR_ID INTEGER NOT NULL, OPERATOR_TYPE CHAR(6) NOT NULL, TOTAL_COST DOUBLE NOT NUL L, IO_COST DOUBLE NOT NULL, CPU_COST DOUBLE NOT N ULL, FIRST_ROW_COST DOUBLE NOT NULL, RE_TOTAL_COST DOUBLE NOT NULL, RE_IO_COST DOUBLE NOT NULL, RE_CPU_COST DOUBLE N OT NULL, COMM_COST DOUBLE NOT NULL, FIRST_COMM_COST DOUBLE NOT NULL, BUFFERS DOUBLE NOT NULL, REMOTE_TOTAL_COST DOUBLE NOT NULL, REMOTE_COMM_COST DOUBLE NOT NULL, FOREIGN KEY (EXPLAIN_REQUE STER, EXPLAIN_TIME, SOURCE_NAME, SOURCE_SCHEMA, SOURCE_VERSION, EXPLAIN_LEVEL, S TMTNO, SECTNO) REFERENCES EXPLAIN_STATEMENT ON DELETE CASCADE) DB20000I SQL コマンドが正常に終了しました。 CREATE TABLE EXPLAIN_PREDICATE ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL, EXPLAI N_TIME TIMESTAMP NOT NULL, SOURCE_NAME VARCHAR(128) NOT NULL, SOUR CE_SCHEMA VARCHAR(128) NOT NULL, SOURCE_VERSION VARCHAR(64) NOT NULL, EX PLAIN_LEVEL CHAR(1) NOT NULL, STMTNO INTEGER NOT NULL, SECTNO INTEGER NOT NULL, OPERATOR_ID INTEGER NOT NULL , PREDICATE_ID INTEGER NOT NULL, HOW_APPLIED CHAR(5) NOT NU LL, WHEN_EVALUATED CHAR(3) NOT NULL, RELOP_TYPE CHAR(2) NOT NULL, SUBQUERY CHAR(1) NOT NULL, FILTER_FACTOR DOUBLE NO T NULL, PREDICATE_TEXT CLOB(2M) NOT LOGGED, FOREIGN KEY (EXPLAIN_REQUESTE R, EXPLAIN_TIME, SOURCE_NAME, SOURCE_SCHEMA, SOURCE_VERSION, EXPLAIN_LEVEL, STMT NO, SECTNO) REFERENCES EXPLAIN_STATEMENT ON DELETE CASCADE) DB20000I SQL コマンドが正常に終了しました。 CREATE TABLE EXPLAIN_STREAM ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL, EXPLAIN_T IME TIMESTAMP NOT NULL, SOURCE_NAME VARCHAR(128) NOT NULL, SOURCE_ SCHEMA VARCHAR(128) NOT NULL, SOURCE_VERSION VARCHAR(64) NOT NULL, EXPLA IN_LEVEL CHAR(1) NOT NULL, STMTNO INTEGER NOT NULL, SEC TNO INTEGER NOT NULL, STREAM_ID INTEGER NOT NULL, S OURCE_TYPE CHAR(1) NOT NULL, SOURCE_ID INTEGER NOT NULL, TARGET_TYPE CHAR(1) NOT NULL, TARGET_ID INTEGER NOT NUL L, OBJECT_SCHEMA VARCHAR(128), OBJECT_NAME VARCHAR(128), STREAM_COUNT DOUBLE NOT NULL, COLUMN_COUNT SMALLINT NOT NULL, PREDICATE_I D INTEGER NOT NULL, COLUMN_NAMES CLOB(2M) NOT LOGGED, PMID SMALLINT NOT NULL, SINGLE_NODE CHAR(5), PARTITION_COLUMNS C LOB(2M) NOT LOGGED, FOREIGN KEY (EXPLAIN_REQUESTER, EXPLAIN_TIME, SOURCE_NAM E, SOURCE_SCHEMA, SOURCE_VERSION, EXPLAIN_LEVEL, STMTNO, SECTNO) REFERENCES EXPL AIN_STATEMENT ON DELETE CASCADE) DB20000I SQL コマンドが正常に終了しました。 CREATE TABLE ADVISE_INDEX ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL WITH DEFAUL T '', EXPLAIN_TIME TIMESTAMP NOT NULL WITH DEFAULT CURRENT TIMESTAMP, S OURCE_NAME VARCHAR(128) NOT NULL WITH DEFAULT '', SOURCE_SCHEMA VARCH AR(128) NOT NULL WITH DEFAULT '', SOURCE_VERSION VARCHAR(64) NOT NULL WITH DEFAULT '', EXPLAIN_LEVEL CHAR(1) NOT NULL WITH DEFAULT '', STMTNO INTEGER NOT NULL WITH DEFAULT 0, SECTNO INTEGER NOT NULL WITH DEFAULT 0, QUERYNO INTEGER NOT NULL WITH DEFAULT 0 , QUERYTAG CHAR(20) NOT NULL WITH DEFAULT '', NAME VA RCHAR(128) NOT NULL, CREATOR VARCHAR(128) NOT NULL WITH DEFAULT '', TBNAME VARCHAR(128) NOT NULL, TBCREATOR VARCHAR(128) NOT NU LL WITH DEFAULT '', COLNAMES CLOB(2M) NOT NULL, UNIQUERULE C HAR(1) NOT NULL WITH DEFAULT '', COLCOUNT SMALLINT NOT NULL WITH DEFAULT 0, IID SMALLINT NOT NULL WITH DEFAULT 0, NLEAF INTEGER NOT NULL WITH DEFAULT 0, NLEVELS SMALLINT NOT NULL WITH DEFAULT 0, FIRSTKEYCARD BIGINT NOT NULL WITH DEFAULT 0, FULLKEYCARD BIGINT NOT NULL WITH DEFAULT 0, CLUSTERRATIO S MALLINT NOT NULL WITH DEFAULT 0, CLUSTERFACTOR DOUBLE NOT NULL W ITH DEFAULT 0, USERDEFINED SMALLINT NOT NULL WITH DEFAULT 0, SYSTEM_R EQUIRED SMALLINT NOT NULL WITH DEFAULT 0, CREATE_TIME TIMESTAMP NOT NULL WITH DEFAULT CURRENT TIMESTAMP, STATS_TIME TIMESTAMP WITH DEFAULT CURRENT TIMESTAMP, PAGE_FETCH_PAIRS VARCHAR(254) NOT NULL WITH DEFAULT '', REMARKS VARCHAR(254) WITH DEFAULT '', DEFINER VARCHAR(128) NOT NULL WITH DEFAULT '', CONVERTED CHAR(1) NOT NULL WITH DEFAULT '', SEQUENTIAL_PAGES INTEGER NOT NULL WITH DEFAULT 0, DENSITY INTEGER NOT NULL WITH DEFAULT 0, FIRST2KEYCARD B IGINT NOT NULL WITH DEFAULT 0, FIRST3KEYCARD BIGINT NOT NULL W ITH DEFAULT 0, FIRST4KEYCARD BIGINT NOT NULL WITH DEFAULT 0, PCTFREE SMALLINT NOT NULL WITH DEFAULT -1, UNIQUE_COLCOUNT SMALLINT NOT NULL WITH DEFAULT -1, MINPCTUSED SMALLINT NOT NULL WITH DEFAUL T 0, REVERSE_SCANS CHAR(1) NOT NULL WITH DEFAULT 'N', USE_INDEX CHAR(1), CREATION_TEXT CLOB(2M) NOT NULL NOT LOGGED WITH DEFAULT '', PACKED_DESC BLOB(1M) NOT LOGGED) DB20000I SQL コマンドが正常に終了しました。 CREATE TABLE ADVISE_WORKLOAD ( WORKLOAD_NAME CHAR(128) NOT NULL WITH DEFA ULT 'WK0', STATEMENT_NO INTEGER NOT NULL WITH DEFAULT 1, STATEMENT_TEX T CLOB(2M) NOT NULL NOT LOGGED, STATEMENT_TAG VARCHAR(256) NOT NULL W ITH DEFAULT '' , FREQUENCY INTEGER NOT NULL WITH DEFAULT 1, IMPORTA NCE DOUBLE NOT NULL WITH DEFAULT 1, WEIGHT DOUBLE NOT NULL WITH DEFAULT 1, COST_BEFORE DOUBLE, COST_AFTER DOUBLE, COM PILABLE CHAR(17)) DB20000I SQL コマンドが正常に終了しました。 COMMIT WORK DB20000I SQL コマンドが正常に終了しました。 CREATE INDEX STMT_I1 on EXPLAIN_STATEMENT(EXPLAIN_TIME, EXPLAIN_LEVEL, STMTNO, S ECTNO) DB20000I SQL コマンドが正常に終了しました。 CREATE INDEX ARG_I1 on EXPLAIN_ARGUMENT(EXPLAIN_TIME, EXPLAIN_LEVEL, STMTNO, SEC TNO, OPERATOR_ID) DB20000I SQL コマンドが正常に終了しました。 CREATE INDEX PRD_I1 on EXPLAIN_PREDICATE(EXPLAIN_TIME, EXPLAIN_LEVEL, STMTNO, SE CTNO, OPERATOR_ID) DB20000I SQL コマンドが正常に終了しました。 CREATE INDEX OPR_I1 on EXPLAIN_OPERATOR(EXPLAIN_TIME, EXPLAIN_LEVEL, STMTNO, SEC TNO, OPERATOR_ID) DB20000I SQL コマンドが正常に終了しました。 CREATE INDEX STM_I1 on EXPLAIN_STREAM(EXPLAIN_TIME, EXPLAIN_LEVEL, STMTNO, SECTN O) DB20000I SQL コマンドが正常に終了しました。 CREATE INDEX OBJ_I1 on EXPLAIN_OBJECT(EXPLAIN_TIME, EXPLAIN_LEVEL, STMTNO, SECTN O) DB20000I SQL コマンドが正常に終了しました。 COMMIT WORK DB20000I SQL コマンドが正常に終了しました。 E:\Sss2003\DeadLock> 何か知らんけどviewをつくる。 create view exp_locks as select operator_type,argument_type,substr(argument_value,1,30) as argument_value from explain_argument,explain_operator where explain_argument.operator_id = explain_operator.operator_id and (argument_type ='ROWLOCK' OR argument_type ='TABLOCK' ) コネクトする。 db2 => connect to zeus2_07 user sss using sss データベース接続情報 データベース・サーバー = DB2/NT 8.1.0 SQL 許可 ID = SSS ローカル・データベース別名 = ZEUS2_07 viewを作る。 db2 => create view exp_locks as select operator_type,argument_type,substr(argume nt_value,1,30) as argument_value from explain_argument,explain_operator where ex plain_argument.operator_id = explain_operator.operator_id and (argument_type ='R OWLOCK' OR argument_type ='TABLOCK' ) DB20000I SQL コマンドが正常に終了しました。 db2 => 問題のSQLをlogから拾ってくる。 今回はログイン時のselect文 SELECT US1.KNJ_FST_NM,US1.KNJ_LST_NM,US1.KANA_NM,US1.SYAIN_KBN,US1.CMP_CD,US1.CMP_NM,US1.SGY_TYP,US1.SYUKO_SAKI_NM,US1.MAIL_ADDR,US1.KNM_FLG,US2.KNM_NO,US1.PRE_LOGIN_DTE,US2.TEN_CD,US2.KAS_CD,US2.SSK_KNR_CD,US2.TEN_KNJ_NM,US2.BU_KNJ_NM,US2.GRP_KNJ_NM,US2.YAKU_CD,US2.YAKU_NM FROM N5TSA0001 US1,N5TSA0002 US2 WHERE US1.USR_ID = 'T9900002' AND US1.STR_YMD <= DATE('2003-06-25') AND US1.END_YMD >= DATE('2003-06-25') AND US1.SSK_KBN = '0' AND US2.KNM_NO = '0' AND US1.USR_ID = US2.USR_ID AND US1.STR_YMD = US2.STR_YMD 単発のupdate文 UPDATE N5TSA0001 SET PRE_LOGIN_DTE = '20030625114345' WHERE USR_ID = 'T9900002' AND STR_YMD <= '2003-06-25' AND END_YMD >= '2003-06-25' 「説明モード」にする。 db2 => set current explain mode explain DB20000I SQL コマンドが正常に終了しました。 select文を実行する。 db2 => SELECT US1.KNJ_FST_NM,US1.KNJ_LST_NM,US1.KANA_NM,US1.SYAIN_KBN,US1.CM P_CD,US1.CMP_NM,US1.SGY_TYP,US1.SYUKO_SAKI_NM,US1.MAIL_ADDR,US1.KNM_FLG,US2.KNM_ NO,US1.PRE_LOGIN_DTE,US2.TEN_CD,US2.KAS_CD,US2.SSK_KNR_CD,US2.TEN_KNJ_NM,US2.BU_ KNJ_NM,US2.GRP_KNJ_NM,US2.YAKU_CD,US2.YAKU_NM FROM N5TSA0001 US1,N5TSA0002 US2 W HERE US1.USR_ID = 'T9900002' AND US1.STR_YMD <= DATE('2003-06-25') AND US1.END_Y MD >= DATE('2003-06-25') AND US1.SSK_KBN = '0' AND US2.KNM_NO = '0' AND US1.USR_ ID = US2.USR_ID AND US1.STR_YMD = US2.STR_YMD SQL0217W EXPLAIN 情報の要求だけが実行されており、このステートメントは実行されませんでした。 SQLSTATE=01604 説明モードを終わる。 db2 => set current explain mode no DB20000I SQL コマンドが正常に終了しました。 このSQLがロックしたものを表示する。 db2 => select * from exp_locks OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE ------------- ------------- ------------------------------ FETCH TABLOCK INTENT SHARE FETCH ROWLOCK NEXT KEY SHARE IXSCAN TABLOCK INTENT SHARE IXSCAN ROWLOCK NEXT KEY SHARE FETCH TABLOCK INTENT SHARE FETCH ROWLOCK NEXT KEY SHARE IXSCAN TABLOCK INTENT SHARE IXSCAN ROWLOCK NEXT KEY SHARE 8 レコードが選択されました。 db2 => 次にupdate文を調べる。 db2 => set current explain mode no DB20000I SQL コマンドが正常に終了しました。 db2 => delete from explain_instance DB20000I SQL コマンドが正常に終了しました。 db2 => select * from exp_locks OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE ------------- ------------- ------------------------------ 0 レコードが選択されました。 db2 => set current explain mode explain DB20000I SQL コマンドが正常に終了しました。 db2 => UPDATE N5TSA0001 SET PRE_LOGIN_DTE = '20030625114345' WHERE USR_ID = 'T9 900002' AND STR_YMD <= '2003-06-25' AND END_YMD >= '2003-06-25' SQL0217W EXPLAIN 情報の要求だけが実行されており、このステートメントは実行されませんでした。 SQLSTATE=01604 db2 => set current explain mode no DB20000I SQL コマンドが正常に終了しました。 db2 => select * from exp_locks OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE ------------- ------------- ------------------------------ FETCH TABLOCK INTENT EXCLUSIVE FETCH ROWLOCK UPDATE IXSCAN TABLOCK INTENT EXCLUSIVE IXSCAN ROWLOCK UPDATE 4 レコードが選択されました。 db2 => やっつけで解決に使った「with ur」のselect文でロックが 外れたか調べる。 db2 => delete from explain_instance DB20000I SQL コマンドが正常に終了しました。 db2 => set current explain mode explain DB20000I SQL コマンドが正常に終了しました。 db2 => SELECT US1.KNJ_FST_NM,US1.KNJ_LST_NM,US1.KANA_NM,US1.SYAIN_KBN,US1.CM P_CD,US1.CMP_NM,US1.SGY_TYP,US1.SYUKO_SAKI_NM,US1.MAIL_ADDR,US1.KNM_FLG,US2.KNM_ NO,US1.PRE_LOGIN_DTE,US2.TEN_CD,US2.KAS_CD,US2.SSK_KNR_CD,US2.TEN_KNJ_NM,US2.BU_ KNJ_NM,US2.GRP_KNJ_NM,US2.YAKU_CD,US2.YAKU_NM FROM N5TSA0001 US1,N5TSA0002 US2 W HERE US1.USR_ID = 'T9900002' AND US1.STR_YMD <= DATE('2003-06-25') AND US1.END_Y MD >= DATE('2003-06-25') AND US1.SSK_KBN = '0' AND US2.KNM_NO = '0' AND US1.USR_ ID = US2.USR_ID AND US1.STR_YMD = US2.STR_YMD with ur SQL0217W EXPLAIN 情報の要求だけが実行されており、このステートメントは実行されませんでした。 SQLSTATE=01604 db2 => set current explain mode no DB20000I SQL コマンドが正常に終了しました。 db2 => select * from exp_locks OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE ------------- ------------- ------------------------------ FETCH TABLOCK INTENT NONE FETCH ROWLOCK NONE IXSCAN TABLOCK INTENT NONE IXSCAN ROWLOCK NONE FETCH TABLOCK INTENT NONE FETCH ROWLOCK NONE IXSCAN TABLOCK INTENT NONE IXSCAN ROWLOCK NONE 8 レコードが選択されました。 db2 => select文は表にISロックと行にNSロック OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE ------------- ------------- ------------------------------ FETCH TABLOCK INTENT SHARE FETCH ROWLOCK NEXT KEY SHARE IXSCAN TABLOCK INTENT SHARE IXSCAN ROWLOCK NEXT KEY SHARE FETCH TABLOCK INTENT SHARE FETCH ROWLOCK NEXT KEY SHARE IXSCAN TABLOCK INTENT SHARE IXSCAN ROWLOCK NEXT KEY SHARE update文は表にIXロックと行にUロック OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE ------------- ------------- ------------------------------ FETCH TABLOCK INTENT EXCLUSIVE FETCH ROWLOCK UPDATE IXSCAN TABLOCK INTENT EXCLUSIVE IXSCAN ROWLOCK UPDATE ダーティリードのselect文は表にINロックで行にはロックなし。 OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE ------------- ------------- ------------------------------ FETCH TABLOCK INTENT NONE FETCH ROWLOCK NONE IXSCAN TABLOCK INTENT NONE IXSCAN ROWLOCK NONE FETCH TABLOCK INTENT NONE FETCH ROWLOCK NONE IXSCAN TABLOCK INTENT NONE IXSCAN ROWLOCK NONE で、伏見ブックの473ページのマトリックスによれば selectのNSロックとupdateのIXロックがぶつかってるのがわかる。 ダーティリードにすると。 selectの行ロックは外れてぶつかるものがなくなる。 select for updateにすると何が変わるのかな? db2 => commit DB20000I SQL コマンドが正常に終了しました。 db2 => delete from explain_instance SQL0100W FETCH、UPDATE または DELETE の対象となる行がないか、または照会の結果が空の表です。 SQLSTATE=02000 db2 => commit DB20000I SQL コマンドが正常に終了しました。 db2 => set current explain mode explain DB20000I SQL コマンドが正常に終了しました。 db2 => select * from N5TSA0001 WHERE USR_ID = 'T9900002' AND STR_YMD <= '2003-0 6-25' AND END_YMD >= '2003-06-25' AND END_YMD >= '2003-06-25' for update of pre_ login_dte SQL0217W EXPLAIN 情報の要求だけが実行されており、このステートメントは実行されませんでした。 SQLSTATE=01604 db2 => set current explain mode no DB20000I SQL コマンドが正常に終了しました。 db2 => select * from exp_locks OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE ------------- ------------- ------------------------------ FETCH TABLOCK INTENT EXCLUSIVE FETCH ROWLOCK UPDATE IXSCAN TABLOCK INTENT EXCLUSIVE IXSCAN ROWLOCK UPDATE 4 レコードが選択されました。 db2 => select for update with csにすると。 db2 => delete from explain_instance DB20000I SQL コマンドが正常に終了しました。 db2 => commit DB20000I SQL コマンドが正常に終了しました。 db2 => set current explain mode explain DB20000I SQL コマンドが正常に終了しました。 db2 => select * from N5TSA0001 WHERE USR_ID = 'T9900002' AND STR_YMD <= '2003-0 6-25' AND END_YMD >= '2003-06-25' AND END_YMD >= '2003-06-25' for update of pre_ login_dte with cs SQL0217W EXPLAIN 情報の要求だけが実行されており、このステートメントは実行されませんでした。 SQLSTATE=01604 db2 => set current explain mode no DB20000I SQL コマンドが正常に終了しました。 db2 => select * from exp_locks OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE ------------- ------------- ------------------------------ FETCH TABLOCK INTENT EXCLUSIVE FETCH ROWLOCK UPDATE IXSCAN TABLOCK INTENT EXCLUSIVE IXSCAN ROWLOCK UPDATE 4 レコードが選択されました。 db2 => JOINしてるとfor updateは効かないらしい。 db2 => SELECT US1.KNJ_FST_NM,US1.KNJ_LST_NM,US1.KANA_NM,US1.SYAIN_KBN,US1.CM P_CD,US1.CMP_NM,US1.SGY_TYP,US1.SYUKO_SAKI_NM,US1.MAIL_ADDR,US1.KNM_FLG,US2.KNM_ NO,US1.PRE_LOGIN_DTE,US2.TEN_CD,US2.KAS_CD,US2.SSK_KNR_CD,US2.TEN_KNJ_NM,US2.BU_ KNJ_NM,US2.GRP_KNJ_NM,US2.YAKU_CD,US2.YAKU_NM FROM N5TSA0001 US1,N5TSA0002 US2 W HERE US1.USR_ID = 'T9900002' AND US1.STR_YMD <= DATE('2003-06-25') AND US1.END_Y MD >= DATE('2003-06-25') AND US1.SSK_KBN = '0' AND US2.KNM_NO = '0' AND US1.USR_ ID = US2.USR_ID AND US1.STR_YMD = US2.STR_YMD for update of PRE_LOGIN_DTE with cs SQL0511N カーソルで指定された表が変更できないので、FOR UPDATE 文節は使用できません。 SQLSTATE=42829 db2 =>