ロックの調査方法
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 =>
2003/06/25
ugya@lycos.com