【发布时间】:2014-01-26 12:10:09
【问题描述】:
我有一个包含大约 11.000.000 条记录的维度,4 个表在 ETL 过程中相互连接以填充我的维度(dimtst)。
insert into dimtst
select .... from tdpst left outer join fhist
left outer join dp2act
left outer join dp2cust
上面的查询持续了很多(tdpst 有 11 条记录,上面的查询持续了大约 15 分钟),因此我创建了一个临时表加入
tdpst 和 fhist 并将结果存储在 tmpDpsInf(我创建的另一个临时表)中。
然后tmpDpsInf 将与C 和D 一起加入另一个有足够执行时间的查询。
create table TMPFHIST
(
abrnchcod NUMBER(4) not null,
tbdptype NUMBER(3) not null,
cfcifno NUMBER(8) not null,
tdserial NUMBER(3) not null,
aistate NUMBER(1)
)
--------------
create table TMPDPSINF
(
abrnchcod NUMBER(4) not null,
tbdptype NUMBER(3) not null,
cfcifno NUMBER(8) not null,
tdserial NUMBER(3) not null,
ausrcode NUMBER(4) not null,
tdtitle VARCHAR2(82),
tdopndat DATE,
tdrnwdat DATE,
tdclsdat DATE,
acurrcode CHAR(3) not null,
abu_abrnchcod NUMBER(4) not null,
aistate NUMBER(1)
)
create table tdpst
(
abrnchcod NUMBER(4) not null,
tbdptype NUMBER(3) not null,
cfcifno NUMBER(8) not null,
tdserial NUMBER(3) not null,
ausrcode NUMBER(4) not null,
tdtitle VARCHAR2(82),
tdopndat DATE,
tdrnwdat DATE,
tdclsdat DATE,
acurrcode CHAR(3) not null,
abu_abrnchcod NUMBER(4) not null
)
--------
tmpDpsInf fills with below query:
insert into tmpDpsInf
select /*+parallel(12)*/
d.ABRNCHCOD,
d.TBDPTYPE,
d.CFCIFNO,
d.TDSERIAL,
d.AUSRCODE AUSRCODE,
d.tdtitle,
trunc(d.tdopndat) TDOPNDAT,
nvl(d.tdrnwdat, d.tdopndat),
nvl(d.tdclsdat, to_date('1500/01/01', 'yyyy/mm/dd')) tdclsdat,
d.acurrcode acurrcode,
d.ABU_ABRNCHCOD ABU_ABRNCHCOD,
tmp.aistate
from tdpst d
left outer join fhist tmp
on d.ABRNCHCOD = tmp.ABRNCHCOD
and d.TBDPTYPE = tmp.TBDPTYPE
and d.CFCIFNO = tmp.CFCIFNO
and d.TDSERIAL = tmp.TDSERIAL
where d.TDOPNDAT <= currdate
1 计划哈希值:3720425100
2
3 ------------------------------------------------- -------------------------------------------------- ----------------------
4 |身份证 |操作 |姓名 |行 |字节 |成本 (%CPU)|时间 | TQ |进出| PQ 分配 |
5 ------------------------------------------------- -------------------------------------------------- ----------------------
6 | 0 |选择声明 | | 12M| 1994M| 4248 (3)| 00:01:17 | | | |
7 | 1 | PX 协调员 | | | | | | | | |
8 | 2 | PX 发送 QC(随机) | :TQ10002 | 12M| 1994M| 4248 (3)| 00:01:17 | Q1,02 | P->S |质量控制 (兰德) |
9 |* 3 |哈希连接右外缓冲| | 12M| 1994M| 4248 (3)| 00:01:17 | Q1,02 | PCWP | |
10 | 4 | PX 接收 | | 3730K| 67M| 178 (3)| 00:00:04 | Q1,02 | PCWP | |
11 | 5 | PX 发送哈希 | :TQ10000 | 3730K| 67M| 178 (3)| 00:00:04 | Q1,00 | P->P |哈希 |
12 | 6 | PX 块迭代器 | | 3730K| 67M| 178 (3)| 00:00:04 | Q1,00 | PCWC | |
13 | 7 |表访问完全 | TMPFHIST | 3730K| 67M| 178 (3)| 00:00:04 | Q1,00 | PCWP | |
14 | 8 | PX 接收 | | 12M| 1774M| 4059 (2)| 00:01:14 | Q1,02 | PCWP | |
15 | 9 | PX 发送哈希 | :TQ10001 | 12M| 1774M| 4059 (2)| 00:01:14 | Q1,01 | P->P |哈希 |
16 | 10 | PX 块迭代器 | | 12M| 1774M| 4059 (2)| 00:01:14 | Q1,01 | PCWC | |
17 |* 11 |表访问完全 | TDPST | 12M| 1774M| 4059 (2)| 00:01:14 | Q1,01 | PCWP | |
18 -------------------------------------------------- -------------------------------------------------- ----------------------
19
20 谓词信息(由操作 id 标识):
21 ------------------------------------------------- --
22
23 3 - 访问("D"."TDSERIAL"="TMP"."TDSERIAL"(+) AND "D"."CFCIFNO"="TMP"."CFCIFNO"(+) AND
24 "D"."TBDPTYPE"="TMP"."TBDPTYPE"(+) AND "D"."ABRNCHCOD"="TMP"."ABRNCHCOD"(+))
25 11 - 过滤器("D"."TDOPNDAT"
27 注意
28 -----
29 - 用于此语句的动态采样(级别 = 4)
30 - 由于提示,并行度为 10
我用 /+leading (d,tmp)/hint 执行了上面的查询。计划如下:
计划哈希值:1033900074
|身份证 |操作 |姓名 |行 |字节 |成本 (%CPU)|时间 | TQ |进出| PQ 分发 |
| 0 |选择声明 | | 12M| 1994M| 4255 (3)| 00:01:17 | | | | | 1 | PX 协调员 | | | | | | | | | | 2 | PX 发送 QC(随机) | :TQ10002 | 12M| 1994M| 4255 (3)| 00:01:17 | Q1,02 | P->S |质量控制 (兰德) | |* 3 |哈希连接外部缓冲| | 12M| 1994M| 4255 (3)| 00:01:17 | Q1,02 | PCWP | | | 4 | PX 接收 | | 12M| 1774M| 4059 (2)| 00:01:14 | Q1,02 | PCWP | | | 5 | PX 发送哈希 | :TQ10000 | 12M| 1774M| 4059 (2)| 00:01:14 | Q1,00 | P->P |哈希 | | 6 | PX 块迭代器 | | 12M| 1774M| 4059 (2)| 00:01:14 | Q1,00 | PCWC | | |* 7 |表访问完全 | TDPST | 12M| 1774M| 4059 (2)| 00:01:14 | Q1,00 | PCWP | | | 8 | PX 接收 | | 3730K| 67M| 178 (3)| 00:00:04 | Q1,02 | PCWP | | | 9 | PX 发送哈希 | :TQ10001 | 3730K| 67M| 178 (3)| 00:00:04 | Q1,01 | P->P |哈希 | | 10 | PX 块迭代器 | | 3730K| 67M| 178 (3)| 00:00:04 | Q1,01 | PCWC | |
| 11 |表访问完全 | TMPFHIST | 3730K| 67M| 178 (3)| 00:00:04 | Q1,01 | PCWP | |
谓词信息(由操作id标识):
3 - 访问("D"."TDSERIAL"="TMP"."TDSERIAL"(+) AND "D"."CFCIFNO"="TMP"."CFCIFNO"(+) AND "D"."TBDPTYPE"="TMP"."TBDPTYPE"(+) AND "D"."ABRNCHCOD"="TMP"."ABRNCCHOD"(+)) 7 - 过滤器("D"."TDOPNDAT"
注意
- 用于此语句的动态采样 (level=4)
- 由于提示,并行度为 10
我在d.TDOPNDAT 上创建了一个索引,在 (tmp.ABRNCHCOD, tmp.TBDPTYPE, tmp.CFCIFNO,tmp.TDSERIAL) 上创建了一个索引
.另外,优化器没有使用任何索引,我强制优化器使用创建的索引,但是查询成本成倍增加! 完成所有提到的工作后,查询时间仍然很长!
有没有人建议减少这个查询时间? 谢谢
【问题讨论】: