昨天一位铁哥们发来一个OLAP的烂SQL,它要跑1分16秒,问一下能否优化,SQL语句和执行计划如下:
SQL> SELECT sum(t.ysje), sum(t.ssje)
2 FROM SWGL_DDJBXX t, SWGL_DDCPBXX dd
3 WHERE dd.dd_id = t.dd_id
4 AND dd.CPBBB_ID = (SELECT MAX(ddcpb.CPBBB_ID)
5 FROM SWGL_DDCPBXX ddcpb
6 WHERE ddcpb.dd_id = t.dd_id)
7 AND t.fzgs_dm = '001093'
8 AND t.skzt IN ('4')
9 AND t.kpzt IN ('0', '1', '2', '3', '4')
10 AND (t.xjbz = '9999' OR
11 t.xjbz IN
12 (SELECT xj.xjbz
13 FROM SWGL_DDXJXX xj
14 WHERE xj.status IN ('0', '1', '2', '3', '4', '5')))
15 AND t.jfzt IN ('0', '1', '2', '3', '4', '5')
16 AND t.ddzt IN ('01', '11', '12', '13', '14')
17 AND t.ddly IN ('01', '02', '03', '04', '05', '06', '07')
18 AND t.FLOWSTATUS IN ('0', '1', '2', '3', '4')
19 AND t.SKZT = '4'
20 AND EXISTS
21 (select 1
22 from SWGL_DDXJQRXX xj
23 where xj.xjbz = t.xjbz
24 and xj.xjqrlx = '1'
25 and xj.wdqrsj >=
26 to_date('2011-09-01 00:00:00', 'yyyy-mm-dd HH24:MI:ss')
27 and xj.xjqr_id = (select max(xjqr_id)
28 from SWGL_DDXJQRXX qr
29 where qr.xjbz = t.xjbz))
30 AND t.SKZT = '4'
31 AND EXISTS
32 (select 1
33 from SWGL_DDXJQRXX xj
34 where xj.xjbz = t.xjbz
35 and xj.xjqrlx = '1'
36 and xj.wdqrsj <=
37 to_date('2011-09-01 23:59:59', 'yyyy-mm-dd HH24:MI:ss')
38 and xj.xjqr_id = (select max(xjqr_id)
39 from SWGL_DDXJQRXX qr
40 where qr.xjbz = t.xjbz));
SUM(T.YSJE) SUM(T.SSJE)
----------- -----------
84000 84000
已用时间: 00: 01: 16.54
执行计划
----------------------------------------------------------
Plan hash value: 262682057
--------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 107 | | 66033 (1)| 00:13:13 |
| 1 | SORT AGGREGATE | | 1 | 107 | | | |
|* 2 | FILTER | | | | | | |
|* 3 | HASH JOIN | | 2628 | 274K| 9456K| 65244 (1)| 00:13:03 |
| 4 | MERGE JOIN | | 98724 | 8291K| | 50450 (1)| 00:10:06 |
| 5 | SORT JOIN | | 3063K| 90M| | 29372 (1)| 00:05:53 |
| 6 | VIEW | VW_SQ_1 | 3063K| 90M| | 29372 (1)| 00:05:53 |
| 7 | HASH GROUP BY | | 3063K| 61M| 189M| 29372 (1)| 00:05:53 |
| 8 | MAT_VIEW ACCESS FULL | SWGL_DDCPBXX | 3111K| 62M| | 9451 (1)| 00:01:54 |
|* 9 | SORT JOIN | | 98724 | 5302K| 15M| 21079 (1)| 00:04:13 |
|* 10 | MAT_VIEW ACCESS BY INDEX ROWID| SWGL_DDJBXX | 98724 | 5302K| | 19748 (1)| 00:03:57 |
|* 11 | INDEX RANGE SCAN | IDX_SWGL_DDJBXX_FZGS | 167K| | | 458 (1)| 00:00:06 |
| 12 | MAT_VIEW ACCESS FULL | SWGL_DDCPBXX | 3111K| 62M| | 9451 (1)| 00:01:54 |
|* 13 | MAT_VIEW ACCESS BY INDEX ROWID | SWGL_DDXJXX | 1 | 24 | | 2 (0)| 00:00:01 |
|* 14 | INDEX UNIQUE SCAN | PK_SWGL_DDXJXX | 1 | | | 1 (0)| 00:00:01 |
|* 15 | MAT_VIEW ACCESS BY INDEX ROWID | SWGL_DDXJQRXX | 1 | 37 | | 2 (0)| 00:00:01 |
|* 16 | INDEX UNIQUE SCAN | PK_SWGL_DDXJQRXX | 1 | | | 1 (0)| 00:00:01 |
| 17 | SORT AGGREGATE | | 1 | 27 | | | |
|* 18 | MAT_VIEW ACCESS FULL | SWGL_DDXJQRXX | 2 | 54 | | 393 (1)| 00:00:05 |
|* 19 | MAT_VIEW ACCESS BY INDEX ROWID | SWGL_DDXJQRXX | 1 | 37 | | 2 (0)| 00:00:01 |
|* 20 | INDEX UNIQUE SCAN | PK_SWGL_DDXJQRXX | 1 | | | 1 (0)| 00:00:01 |
| 21 | SORT AGGREGATE | | 1 | 27 | | | |
|* 22 | MAT_VIEW ACCESS FULL | SWGL_DDXJQRXX | 2 | 54 | | 393 (1)| 00:00:05 |
--------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(("T"."XJBZ"='9999' OR EXISTS (SELECT 0 FROM "SWGL_DDXJXX" "XJ" WHERE "XJ"."XJBZ"=:B1 AND
("XJ"."STATUS"='0' OR "XJ"."STATUS"='1' OR "XJ"."STATUS"='2' OR "XJ"."STATUS"='3' OR "XJ"."STATUS"='4' OR
"XJ"."STATUS"='5'))) AND EXISTS (SELECT 0 FROM "SWGL_DDXJQRXX" "XJ" WHERE "XJ"."XJQR_ID"= (SELECT
MAX("XJQR_ID") FROM "SWGL_DDXJQRXX" "QR" WHERE "QR"."XJBZ"=:B2) AND "XJ"."XJBZ"=:B3 AND
"XJ"."WDQRSJ">=TO_DATE('2011-09-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND "XJ"."XJQRLX"='1') AND EXISTS
(SELECT 0 FROM "SWGL_DDXJQRXX" "XJ" WHERE "XJ"."XJQR_ID"= (SELECT MAX("XJQR_ID") FROM "SWGL_DDXJQRXX" "QR"
WHERE "QR"."XJBZ"=:B4) AND "XJ"."XJBZ"=:B5 AND "XJ"."XJQRLX"='1' AND "XJ"."WDQRSJ"<=TO_DATE('2011-09-01
23:59:59', 'yyyy-mm-dd hh24:mi:ss')))
3 - access("DD"."DD_ID"="T"."DD_ID" AND "DD"."CPBBB_ID"="VW_COL_1")
9 - access("DD_ID"="T"."DD_ID")
filter("DD_ID"="T"."DD_ID")
10 - filter("T"."SKZT"='4' AND ("T"."DDLY"='01' OR "T"."DDLY"='02' OR "T"."DDLY"='03' OR "T"."DDLY"='04'
OR "T"."DDLY"='05' OR "T"."DDLY"='06' OR "T"."DDLY"='07') AND ("T"."JFZT"='0' OR "T"."JFZT"='1' OR
"T"."JFZT"='2' OR "T"."JFZT"='3' OR "T"."JFZT"='4' OR "T"."JFZT"='5') AND ("T"."KPZT"='0' OR "T"."KPZT"='1'
OR "T"."KPZT"='2' OR "T"."KPZT"='3' OR "T"."KPZT"='4') AND ("T"."DDZT"='01' OR "T"."DDZT"='11' OR
"T"."DDZT"='12' OR "T"."DDZT"='13' OR "T"."DDZT"='14') AND ("T"."FLOWSTATUS"='0' OR "T"."FLOWSTATUS"='1' OR
"T"."FLOWSTATUS"='2' OR "T"."FLOWSTATUS"='3' OR "T"."FLOWSTATUS"='4'))
11 - access("T"."FZGS_DM"='001093')
13 - filter("XJ"."STATUS"='0' OR "XJ"."STATUS"='1' OR "XJ"."STATUS"='2' OR "XJ"."STATUS"='3' OR
"XJ"."STATUS"='4' OR "XJ"."STATUS"='5')
14 - access("XJ"."XJBZ"=:B1)
15 - filter("XJ"."XJBZ"=:B1 AND "XJ"."WDQRSJ">=TO_DATE('2011-09-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
AND "XJ"."XJQRLX"='1')
16 - access("XJ"."XJQR_ID"= (SELECT MAX("XJQR_ID") FROM "SWGL_DDXJQRXX" "QR" WHERE "QR"."XJBZ"=:B1))
18 - filter("QR"."XJBZ"=:B1)
19 - filter("XJ"."XJBZ"=:B1 AND "XJ"."XJQRLX"='1' AND "XJ"."WDQRSJ"<=TO_DATE('2011-09-01 23:59:59',
'yyyy-mm-dd hh24:mi:ss'))
20 - access("XJ"."XJQR_ID"= (SELECT MAX("XJQR_ID") FROM "SWGL_DDXJQRXX" "QR" WHERE "QR"."XJBZ"=:B1))
22 - filter("QR"."XJBZ"=:B1)
统计信息
----------------------------------------------------------
123 recursive calls
7 db block gets
9720499 consistent gets
15452 physical reads
0 redo size
589 bytes sent via SQL*Net to client
469 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
1 sorts (disk)
1 rows processed
首先,我想骂人了,写这个SQL的人水平也太菜了吧,请注意看这个SQL,相信你看了它几秒钟就会骂人了,于是我对它进行了改写
SELECT sum(t.ysje), sum(t.ssje)
FROM SWGL_DDJBXX t, SWGL_DDCPBXX dd
WHERE dd.dd_id = t.dd_id
AND dd.CPBBB_ID = (SELECT MAX(ddcpb.CPBBB_ID)
FROM SWGL_DDCPBXX ddcpb
WHERE ddcpb.dd_id = t.dd_id)
AND t.fzgs_dm = '001093'
AND t.skzt IN ('4')
AND t.kpzt IN ('0', '1', '2', '3', '4')
AND (t.xjbz = '9999' OR
t.xjbz IN
(SELECT xj.xjbz
FROM SWGL_DDXJXX xj
WHERE xj.status IN ('0', '1', '2', '3', '4', '5')))
AND t.jfzt IN ('0', '1', '2', '3', '4', '5')
AND t.ddzt IN ('01', '11', '12', '13', '14')
AND t.ddly IN ('01', '02', '03', '04', '05', '06', '07')
AND t.FLOWSTATUS IN ('0', '1', '2', '3', '4')
AND t.SKZT = '4'
AND EXISTS
(select
1
from SWGL_DDXJQRXX xj
where xj.xjbz = t.xjbz
and xj.xjqrlx = '1'
and xj.wdqrsj >=
to_date('2011-09-01 00:00:00', 'yyyy-mm-dd HH24:MI:ss')
and xj.wdqrsj <=
to_date('2011-09-01 23:59:59', 'yyyy-mm-dd HH24:MI:ss')
and xj.xjqr_id = (select
max(xjqr_id)
from SWGL_DDXJQRXX qr
where qr.xjbz = t.xjbz))
AND t.SKZT = '4'
更改了SQL之后,跑了一次SQL,依然要跑1分多,好了现在才开始进入优化的正题,SQL优化做得多了,一眼就能看出这个SQL性能问题出在 and EXISTS 这个地方,于是让哥们去掉
and EXISTS部分,看SQL需要多久跑完
SELECT sum(t.ysje), sum(t.ssje)
FROM SWGL_DDJBXX t, SWGL_DDCPBXX dd
WHERE dd.dd_id = t.dd_id
AND dd.CPBBB_ID = (SELECT MAX(ddcpb.CPBBB_ID)
FROM SWGL_DDCPBXX ddcpb
WHERE ddcpb.dd_id = t.dd_id)
AND t.fzgs_dm = '001093'
AND t.skzt IN ('4')
AND t.kpzt IN ('0', '1', '2', '3', '4')
AND (t.xjbz = '9999' OR
t.xjbz IN
(SELECT xj.xjbz
FROM SWGL_DDXJXX xj
WHERE xj.status IN ('0', '1', '2', '3', '4', '5')))
AND t.jfzt IN ('0', '1', '2', '3', '4', '5')
AND t.ddzt IN ('01', '11', '12', '13', '14')
AND t.ddly IN ('01', '02', '03', '04', '05', '06', '07')
AND t.FLOWSTATUS IN ('0', '1', '2', '3', '4')
AND t.SKZT = '4'
哥们回复说,只要2秒。那么现在应该把精力放在优化
AND EXISTS
(select
1
from SWGL_DDXJQRXX xj
where xj.xjbz = t.xjbz
and xj.xjqrlx = '1'
and xj.wdqrsj >=
to_date('2011-09-01 00:00:00', 'yyyy-mm-dd HH24:MI:ss')
and xj.wdqrsj <=
to_date('2011-09-01 23:59:59', 'yyyy-mm-dd HH24:MI:ss')
and xj.xjqr_id = (select
max(xjqr_id)
from SWGL_DDXJQRXX qr
where qr.xjbz = t.xjbz))
分析了原始执行计划后,在SWGL_DDXJQRXX这个物化视图上建立了2个索引
create index idx1 on SWGL_DDXJQRXX(wdqrsj,xjqrlx);
create index idx2 on SWGL_DDXJQRXX(xjqr_id,xjbz);
在物化视图上面加了2个索引之后,让哥们跑了一下SQL,发现没起作用,真太悲剧了,物化视图有点变态啊,居然不走索引(其实这里还是CBO计算基数出了问题,暂时就不说这个了)
于是让哥们加2个HINT,语句如下:
SQL> SELECT sum(t.ysje), sum(t.ssje) FROM SWGL_DDJBXX t, SWGL_DDCPBXX dd WHERE dd.dd_id = t.dd_id AND dd.CPBBB_ID = (SELECT MAX(ddcpb.CPBBB_ID) FROM SWGL_DDCPBXX ddcpb WHERE ddcpb.dd_id = t.dd_id) AND t.fzgs_dm = '001093' AND t.skzt IN ('4') AND
t.kpzt IN ('0', '1', '2', '3', '4') AND (t.xjbz = '9999' OR t.xjbz IN (SELECT xj.xjbz FROM SWGL_DDXJXX xj WHERE xj.status IN ('0', '1', '2', '3', '4', '5'))) AND t.jfzt IN ('0', '1', '2', '3', '4', '5') AND t.ddzt IN ('01', '11', '12', '13', '14') AND t.ddly I
N ('01', '02', '03', '04', '05', '06', '07') AND t.FLOWSTATUS IN ('0', '1', '2', '3', '4') AND t.SKZT = '4' AND EXISTS (select /*+ index(xj idx_SWGL_DDXJQRXX_wdq_xjq) */ 1 from SWGL_DDXJQRXX xj where xj.xjbz = t.xjbz and xj.xjqrlx = '1' and xj.wdqrs
j >= to_date('2011-09-01 00:00:00', 'yyyy-mm-dd HH24:MI:ss') and xj.wdqrsj <= to_date('2011-09-01 23:59:59', 'yyyy-mm-dd HH24:MI:ss') and xj.xjqr_id = (select /*+ index(qr idx_SWGL_DDXJQRXX_xjq_xjb) */ max(xjqr_id)
from SWGL_DDXJQRXX qr where qr.xjbz = t.xjbz)) AND t.SKZT = '4';
SUM(T.YSJE) SUM(T.SSJE)
----------- -----------
84000 84000
已用时间: 00: 00: 16.29
执行计划
----------------------------------------------------------
Plan hash value: 3675331138
---------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 107 | | 59521 (1)| 00:11:55 |
| 1 | SORT AGGREGATE | | 1 | 107 | | | |
|* 2 | FILTER | | | | | | |
|* 3 | HASH JOIN | | 2628 | 274K| 9456K| 58858 (1)| 00:11:47 |
| 4 | MERGE JOIN | | 98724 | 8291K| | 50450 (1)| 00:10:06 |
| 5 | SORT JOIN | | 3063K| 90M| | 29372 (1)| 00:05:53 |
| 6 | VIEW | VW_SQ_1 | 3063K| 90M| | 29372 (1)| 00:05:53 |
| 7 | HASH GROUP BY | | 3063K| 61M| 189M| 29372 (1)| 00:05:53 |
| 8 | MAT_VIEW ACCESS FULL | SWGL_DDCPBXX | 3111K| 62M| | 9451 (1)| 00:01:54 |
|* 9 | SORT JOIN | | 98724 | 5302K| 15M| 21079 (1)| 00:04:13 |
|* 10 | MAT_VIEW ACCESS BY INDEX ROWID| SWGL_DDJBXX | 98724 | 5302K| | 19748 (1)| 00:03:57 |
|* 11 | INDEX RANGE SCAN | IDX_SWGL_DDJBXX_FZGS | 167K| | | 458 (1)| 00:00:06 |
| 12 | INDEX FAST FULL SCAN | IDX_SWGL_DDCPBXX_DD_ID_CPBB | 3111K| 62M| | 3066 (1)| 00:00:37 |
|* 13 | MAT_VIEW ACCESS BY INDEX ROWID | SWGL_DDXJXX | 1 | 24 | | 2 (0)| 00:00:01 |
|* 14 | INDEX UNIQUE SCAN | PK_SWGL_DDXJXX | 1 | | | 1 (0)| 00:00:01 |
|* 15 | FILTER | | | | | | |
|* 16 | MAT_VIEW ACCESS BY INDEX ROWID | SWGL_DDXJQRXX | 1 | 37 | | 33 (0)| 00:00:01 |
|* 17 | INDEX RANGE SCAN | IDX_SWGL_DDXJQRXX_WDQ_XJQ | 152 | | | 2 (0)| 00:00:01 |
| 18 | SORT AGGREGATE | | 1 | 27 | | | |
|* 19 | INDEX FULL SCAN | IDX_SWGL_DDXJQRXX_XJQ_XJB | 2 | 54 | | 631 (1)| 00:00:08 |
---------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(("T"."XJBZ"='9999' OR EXISTS (SELECT 0 FROM "SWGL_DDXJXX" "XJ" WHERE "XJ"."XJBZ"=:B1 AND
("XJ"."STATUS"='0' OR "XJ"."STATUS"='1' OR "XJ"."STATUS"='2' OR "XJ"."STATUS"='3' OR "XJ"."STATUS"='4' OR
"XJ"."STATUS"='5'))) AND EXISTS (SELECT /*+ INDEX ("XJ" "IDX_SWGL_DDXJQRXX_WDQ_XJQ") */ 0 FROM "SWGL_DDXJQRXX"
"XJ" WHERE "XJ"."XJQR_ID"= (SELECT /*+ INDEX ("QR" "IDX_SWGL_DDXJQRXX_XJQ_XJB") */ MAX("XJQR_ID") FROM
"SWGL_DDXJQRXX" "QR" WHERE "QR"."XJBZ"=:B2) AND "XJ"."WDQRSJ"<=TO_DATE('2011-09-01 23:59:59', 'yyyy-mm-dd
hh24:mi:ss') AND "XJ"."WDQRSJ">=TO_DATE('2011-09-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND "XJ"."XJBZ"=:B3 AND
"XJ"."XJQRLX"='1'))
3 - access("DD"."DD_ID"="T"."DD_ID" AND "DD"."CPBBB_ID"="VW_COL_1")
9 - access("DD_ID"="T"."DD_ID")
filter("DD_ID"="T"."DD_ID")
10 - filter("T"."SKZT"='4' AND ("T"."DDLY"='01' OR "T"."DDLY"='02' OR "T"."DDLY"='03' OR "T"."DDLY"='04' OR
"T"."DDLY"='05' OR "T"."DDLY"='06' OR "T"."DDLY"='07') AND ("T"."JFZT"='0' OR "T"."JFZT"='1' OR "T"."JFZT"='2' OR
"T"."JFZT"='3' OR "T"."JFZT"='4' OR "T"."JFZT"='5') AND ("T"."KPZT"='0' OR "T"."KPZT"='1' OR "T"."KPZT"='2' OR
"T"."KPZT"='3' OR "T"."KPZT"='4') AND ("T"."DDZT"='01' OR "T"."DDZT"='11' OR "T"."DDZT"='12' OR "T"."DDZT"='13' OR
"T"."DDZT"='14') AND ("T"."FLOWSTATUS"='0' OR "T"."FLOWSTATUS"='1' OR "T"."FLOWSTATUS"='2' OR "T"."FLOWSTATUS"='3'
OR "T"."FLOWSTATUS"='4'))
11 - access("T"."FZGS_DM"='001093')
13 - filter("XJ"."STATUS"='0' OR "XJ"."STATUS"='1' OR "XJ"."STATUS"='2' OR "XJ"."STATUS"='3' OR
"XJ"."STATUS"='4' OR "XJ"."STATUS"='5')
14 - access("XJ"."XJBZ"=:B1)
15 - filter("XJ"."XJQR_ID"= (SELECT /*+ INDEX ("QR" "IDX_SWGL_DDXJQRXX_XJQ_XJB") */ MAX("XJQR_ID") FROM
"SWGL_DDXJQRXX" "QR" WHERE "QR"."XJBZ"=:B1))
16 - filter("XJ"."XJBZ"=:B1)
17 - access("XJ"."WDQRSJ">=TO_DATE('2011-09-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND "XJ"."XJQRLX"='1' AND
"XJ"."WDQRSJ"<=TO_DATE('2011-09-01 23:59:59', 'yyyy-mm-dd hh24:mi:ss'))
filter("XJ"."XJQRLX"='1')
19 - access("QR"."XJBZ"=:B1)
filter("QR"."XJBZ"=:B1)
统计信息
----------------------------------------------------------
131 recursive calls
8 db block gets
200563 consistent gets
16341 physical reads
0 redo size
589 bytes sent via SQL*Net to client
469 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
1 sorts (disk)
1 rows processed
这下跑了16秒,发现执行计划里面有SORT MERGE JOIN,于是怀疑统计信息有问题,很可惜,那哥们收集统计信息出错了(问题太复杂了,省略),所以又加了个HINT
SQL> SELECT /*+ use_hash(t,dd) */ sum(t.ysje), sum(t.ssje) FROM SWGL_DDJBXX t, SWGL_DDCPBXX dd WHERE dd.dd_id = t.dd_id AND dd.CPBBB_ID = (SELECT MAX(ddcpb.CPBBB_ID) FROM SWGL_DDCPBXX ddcpb WHERE ddcpb.dd_id = t.dd_id) AND t.fzgs_dm = '001093' AND
t.skzt IN ('4') AND t.kpzt IN ('0', '1', '2', '3', '4') AND (t.xjbz = '9999' OR t.xjbz IN (SELECT xj.xjbz FROM SWGL_DDXJXX xj WHERE xj.status IN ('0', '1', '2', '3', '4', '5'))) AND t.jfzt IN ('0', '1', '2', '3', '4', '5') AND t.ddzt IN ('01', '11', '12', '13'
, '14') AND t.ddly IN ('01', '02', '03', '04', '05', '06', '07') AND t.FLOWSTATUS IN ('0', '1', '2', '3', '4') AND t.SKZT = '4' AND EXISTS (select /*+ index(xj idx_SWGL_DDXJQRXX_wdq_xjq) */ 1 from SWGL_DDXJQRXX xj where xj.xjbz = t.xjbz and xj.xjqrlx = '1'
and xj.wdqrsj >= to_date('2011-09-01 00:00:00', 'yyyy-mm-dd HH24:MI:ss') and xj.wdqrsj <= to_date('2011-09-01 23:59:59', 'yyyy-mm-dd HH24:MI:ss') and xj.xjqr_id = (select /*+ index(qr idx_SWGL_DDXJQRXX_xjq_xjb) */
max(xjqr_id) from SWGL_DDXJQRXX qr where qr.xjbz = t.xjbz)) AND t.SKZT = '4';
SUM(T.YSJE) SUM(T.SSJE)
----------- -----------
84000 84000
已用时间: 00: 00: 09.00
执行计划
----------------------------------------------------------
Plan hash value: 2004668452
--------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 107 | | 64720 (1)| 00:12:57 |
| 1 | SORT AGGREGATE | | 1 | 107 | | | |
|* 2 | FILTER | | | | | | |
|* 3 | HASH JOIN | | 2628 | 274K| 8624K| 64057 (1)| 00:12:49 |
|* 4 | HASH JOIN | | 100K| 7442K| 6464K| 28011 (1)| 00:05:37 |
|* 5 | MAT_VIEW ACCESS BY INDEX ROWID| SWGL_DDJBXX | 98724 | 5302K| | 19748 (1)| 00:03:57 |
|* 6 | INDEX RANGE SCAN | IDX_SWGL_DDJBXX_FZGS | 167K| | | 458 (1)| 00:00:06 |
| 7 | INDEX FAST FULL SCAN | IDX_SWGL_DDCPBXX_DD_ID_CPBB | 3111K| 62M| | 3066 (1)| 00:00:37 |
| 8 | VIEW | VW_SQ_1 | 3063K| 90M| | 29372 (1)| 00:05:53 |
| 9 | HASH GROUP BY | | 3063K| 61M| 189M| 29372 (1)| 00:05:53 |
| 10 | MAT_VIEW ACCESS FULL | SWGL_DDCPBXX | 3111K| 62M| | 9451 (1)| 00:01:54 |
|* 11 | MAT_VIEW ACCESS BY INDEX ROWID | SWGL_DDXJXX | 1 | 24 | | 2 (0)| 00:00:01 |
|* 12 | INDEX UNIQUE SCAN | PK_SWGL_DDXJXX | 1 | | | 1 (0)| 00:00:01 |
|* 13 | FILTER | | | | | | |
|* 14 | MAT_VIEW ACCESS BY INDEX ROWID| SWGL_DDXJQRXX | 1 | 37 | | 33 (0)| 00:00:01 |
|* 15 | INDEX RANGE SCAN | IDX_SWGL_DDXJQRXX_WDQ_XJQ | 152 | | | 2 (0)| 00:00:01 |
| 16 | SORT AGGREGATE | | 1 | 27 | | | |
|* 17 | INDEX FULL SCAN | IDX_SWGL_DDXJQRXX_XJQ_XJB | 2 | 54 | | 631 (1)| 00:00:08 |
--------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(("T"."XJBZ"='9999' OR EXISTS (SELECT 0 FROM "SWGL_DDXJXX" "XJ" WHERE "XJ"."XJBZ"=:B1 AND
("XJ"."STATUS"='0' OR "XJ"."STATUS"='1' OR "XJ"."STATUS"='2' OR "XJ"."STATUS"='3' OR "XJ"."STATUS"='4' OR
"XJ"."STATUS"='5'))) AND EXISTS (SELECT /*+ INDEX ("XJ" "IDX_SWGL_DDXJQRXX_WDQ_XJQ") */ 0 FROM "SWGL_DDXJQRXX"
"XJ" WHERE "XJ"."XJQR_ID"= (SELECT /*+ INDEX ("QR" "IDX_SWGL_DDXJQRXX_XJQ_XJB") */ MAX("XJQR_ID") FROM
"SWGL_DDXJQRXX" "QR" WHERE "QR"."XJBZ"=:B2) AND "XJ"."WDQRSJ"<=TO_DATE('2011-09-01 23:59:59', 'yyyy-mm-dd
hh24:mi:ss') AND "XJ"."WDQRSJ">=TO_DATE('2011-09-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND "XJ"."XJBZ"=:B3 AND
"XJ"."XJQRLX"='1'))
3 - access("DD"."CPBBB_ID"="VW_COL_1" AND "DD_ID"="T"."DD_ID")
4 - access("DD"."DD_ID"="T"."DD_ID")
5 - filter("T"."SKZT"='4' AND ("T"."DDLY"='01' OR "T"."DDLY"='02' OR "T"."DDLY"='03' OR "T"."DDLY"='04' OR
"T"."DDLY"='05' OR "T"."DDLY"='06' OR "T"."DDLY"='07') AND ("T"."JFZT"='0' OR "T"."JFZT"='1' OR "T"."JFZT"='2' OR
"T"."JFZT"='3' OR "T"."JFZT"='4' OR "T"."JFZT"='5') AND ("T"."KPZT"='0' OR "T"."KPZT"='1' OR "T"."KPZT"='2' OR
"T"."KPZT"='3' OR "T"."KPZT"='4') AND ("T"."DDZT"='01' OR "T"."DDZT"='11' OR "T"."DDZT"='12' OR "T"."DDZT"='13'
OR "T"."DDZT"='14') AND ("T"."FLOWSTATUS"='0' OR "T"."FLOWSTATUS"='1' OR "T"."FLOWSTATUS"='2' OR
"T"."FLOWSTATUS"='3' OR "T"."FLOWSTATUS"='4'))
6 - access("T"."FZGS_DM"='001093')
11 - filter("XJ"."STATUS"='0' OR "XJ"."STATUS"='1' OR "XJ"."STATUS"='2' OR "XJ"."STATUS"='3' OR
"XJ"."STATUS"='4' OR "XJ"."STATUS"='5')
12 - access("XJ"."XJBZ"=:B1)
13 - filter("XJ"."XJQR_ID"= (SELECT /*+ INDEX ("QR" "IDX_SWGL_DDXJQRXX_XJQ_XJB") */ MAX("XJQR_ID") FROM
"SWGL_DDXJQRXX" "QR" WHERE "QR"."XJBZ"=:B1))
14 - filter("XJ"."XJBZ"=:B1)
15 - access("XJ"."WDQRSJ">=TO_DATE('2011-09-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND "XJ"."XJQRLX"='1' AND
"XJ"."WDQRSJ"<=TO_DATE('2011-09-01 23:59:59', 'yyyy-mm-dd hh24:mi:ss'))
filter("XJ"."XJQRLX"='1')
17 - access("QR"."XJBZ"=:B1)
filter("QR"."XJBZ"=:B1)
统计信息
----------------------------------------------------------
47 recursive calls
0 db block gets
195216 consistent gets
5642 physical reads
0 redo size
589 bytes sent via SQL*Net to client
469 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
到了这里,这个SQL能在9秒左右跑完,
逻辑读和物理读分别由
9720499 consistent gets
15452 physical reads
降低到了
195216 consistent gets
5642 physical reads
你可能会想,为什么还有5642的物理读呢?那是因为PGA太小了,才1G
|* 3 | HASH JOIN | | 2628 | 274K| 8624K| 64057 (1)| 00:12:49 |
|* 4 | HASH JOIN | | 100K| 7442K| 6464K| 28011 (1)| 00:05:37 |
| 9 | HASH GROUP BY | | 3063K| 61M| 189M| 29372 (1)| 00:05:53 |
| 10 | MAT_VIEW ACCESS FULL | SWGL_DDCPBXX | 3111K| 62M| | 9451 (1)| 00:01:54 |
第3,4,第9步 这里有2个HASH JOIN 需要磁盘hash join, 第九步那里做HASH GROUP BY 也需要磁盘HASH GROUP BY,真搞不懂 是OLAP的仓库PGA怎么才1G
太悲剧了,SQL烂,数据库服务器也烂 嘎嘎。