有个SQL Statement的问题, 使用db2advis没有任何建议, 所有涉及的4各表都有primary key. 可是运行时间过长.
select distinct n.NOTE_AGENCY as Agency, n.DISPLAY_NOTE_TYPE_CD as NoticeType, n.NOTE_NO as NoticeNumber,
n.INFRINGEMENT_TS as OffenceTime,
date(n.CREATION_TS) as NoticeEnteringDate,
max((case when n.UPDATED_TS > i.UPDATED_TS then date(n.UPDATED_TS) else date(i.UPDATED_TS) end)) as UpdatingDate,
d.DRIVERS_LICENCE_NO as LicenceNo,
d.BIRTH_DT as DoB,
d.GENDER_CD as Gender,
d.IDNT_TYPE_CD as IDENTITY_TYPE,
n.notice_id
from PIPS.NOTICE n
inner join PIPS.INFRINGEMENT i on (i.NOTICE_ID=n.NOTICE_ID)
inner join PIPS.IDENTITY d on (d.PIB_ID=n.PIB_ID)
left outer join PIPS.COURT_CASE c on (c.NOTICE_ID=i.NOTICE_ID and c.IFMT_NUMBER=i.IFMT_NUMBER)
where
n.NOTE_TYPE_CD in (1,3,4,5,10) AND
( ((date(n.CREATION_TS)>'2014-08-05-00.00.00.000000') and (date(n.CREATION_TS)<='2014-08-06-00.00.00.000000')) or
((date(i.CREATED_TS)>'2014-08-05-00.00.00.000000') and (date(i.CREATED_TS)<='2014-08-06-00.00.00.000000')) or
((date(n.UPDATED_TS)>'2014-08-05-00.00.00.000000') and (date(n.UPDATED_TS)<='2014-08-06-00.00.00.000000')) or
((date(i.UPDATED_TS)>'2014-08-05-00.00.00.000000') and (date(i.UPDATED_TS)<='2014-08-06-00.00.00.000000')) or
((i.ACTION_DT>'2014-08-05-00.00.00.000000') and (i.ACTION_DT<='2014-08-06-00.00.00.000000')) or
((c.OUTCOME_DT>'2014-08-05-00.00.00.000000') and (c.OUTCOME_DT<='2014-08-06-00.00.00.000000')) )
AND(i.IFMT_STATUS_CD in (1,2,3,7,8,9,10,11)
or (i.IFMT_STATUS_CD = 6 and c.outcome_type_cd = 26 )
or (i.IFMT_STATUS_CD in (4, 5) and ( c.outcome_type_cd is null or c.outcome_type_cd in (6,17,18,26,38,39)))
)
AND n.NOTE_TYPE_CD not in(8, 9)
and n.note_status_cd > 0
group by n.notice_id, NOTE_AGENCY, n.DISPLAY_NOTE_TYPE_CD, note_no,INFRINGEMENT_TS,n.CREATION_TS,d.DRIVERS_LICENCE_NO,d.BIRTH_DT,d.GENDER_CD,d.IDNT_TYPE_CD;
使用db2expln后, 确实用的是TABLE SCAN, 所以建了几个另外的index, 建完index后access plan也确实走了INDEX SCAN, 但是时间还是老样子! A/P请参见两个附件
下面是几个INDEX
CREATE UNIQUE INDEX "PIPS "."XP1_INFRINGEMENT" ON "PIPS "."INFRINGEMENT"
("NOTICE_ID" ASC,
"IFMT_NUMBER" ASC) INCLUDE
("UPDATED_TS" ASC,
"CREATED_TS" ASC,
"ACTION_DT" ASC,
"IFMT_STATUS_CD" ASC)
ALLOW REVERSE SCANS;
CREATE UNIQUE INDEX "PIPS "."XP1_IDENTITY" ON "PIPS "."IDENTITY"
("PIB_ID" ASC)
INCLUDE ("DRIVERS_LICENCE_NO" ASC,
"BIRTH_DT" ASC,
"GENDER_CD" ASC,
"IDNT_TYPE_CD" ASC)
ALLOW REVERSE SCANS;
drop index pips.XP1_IDENTITY;
CREATE UNIQUE INDEX "PIPS "."XP2_IDENTITY" ON "PIPS "."IDENTITY"
("PIB_ID" ASC,
"DRIVERS_LICENCE_NO" ASC,
"BIRTH_DT" ASC,
"GENDER_CD" ASC,
"IDNT_TYPE_CD" ASC
)
ALLOW REVERSE SCANS;
CREATE UNIQUE INDEX "PIPS "."XP1_NOTICE" ON "PIPS "."NOTICE"
("NOTICE_ID" ASC)
INCLUDE (
"NOTE_AGENCY" ASC,
"DISPLAY_NOTE_TYPE_CD" ASC,
"NOTE_NO" ASC,
"INFRINGEMENT_TS" ASC,
"CREATION_TS" ASC,
"UPDATED_TS" ASC,
"PIB_ID" ASC,
"NOTE_TYPE_CD" ASC,
"NOTE_STATUS_CD" ASC)
ALLOW REVERSE SCANS;
CREATE UNIQUE INDEX "PIPS "."XP1_COURT_CASE" ON "PIPS "."COURT_CASE"
("NOTICE_ID" ASC,
"IFMT_NUMBER" ASC)
INCLUDE (
"OUTCOME_DT" ASC,
"OUTCOME_TYPE_CD" ASC)
ALLOW REVERSE SCANS;
DROP INDEX PIPS.XP1_COURT_CASE;
CREATE INDEX "PIPS "."XP2_COURT_CASE" ON "PIPS "."COURT_CASE"
("OUTCOME_DT" ASC)
ALLOW REVERSE SCANS;
CREATE INDEX "PIPS "."XP3_COURT_CASE" ON "PIPS "."COURT_CASE"
("OUTCOME_TYPE_CD" ASC)
ALLOW REVERSE SCANS;
runstats on TABLE "PIPS "."INFRINGEMENT" with distribution and detailed index all;
runstats on TABLE "PIPS "."IDENTITY" with distribution and detailed index all;
runstats on TABLE "PIPS "."NOTICE" with distribution and detailed index all;
runstats on TABLE "PIPS "."COURT_CASE" with distribution and detailed index all;