sag*_*agi 21 sql oracle optimization performance view
我的SELECT
声明运行得很慢,它阻碍了我们的夜间进程.
查询是:(请不要评论隐式连接语法,这是由运行此代码的Informatica自动生成的):
SELECT *
FROM STG_DIM_CRM_CASES,V_CRM_CASE_ID_EXISTS_IN_DWH,stg_scd_customers_key
WHERE STG_DIM_CRM_CASES.CRM_CASE_ID = V_CRM_CASE_ID_EXISTS_IN_DWH.CASE_ID(+)
AND STG_DIM_CRM_CASES.account_number = stg_scd_customers_key.account_number(+)
and STG_DIM_CRM_CASES.Case_Create_Date between stg_scd_customers_key.start_date(+) and stg_scd_customers_key.end_date(+)
Run Code Online (Sandbox Code Playgroud)
编辑:实际查询仅选择account_number,start_date,end_date
另一个未编制索引的列.
表格信息:
STG_DIM_CRM_CASES
Index - (Account_Number,Case_Create_Date)
size - 270k records.
Run Code Online (Sandbox Code Playgroud)
stg_scd_customers_key
Index - Account_Number,Start_Date,End_Date
Partitioned - End_Date
Size - 500 million records.
Run Code Online (Sandbox Code Playgroud)
V_CRM_CASE_ID_EXISTS_IN_DWH(查看) -
select t.case_id
from crm_ps_rc_case t, dim_crm_cases x
where t.case_id=x.crm_case_id;
Run Code Online (Sandbox Code Playgroud)
dim_crm_cases -
Indexed - (crm_case_id)
Size - 100 million .
Run Code Online (Sandbox Code Playgroud)
crm_ps_rc_case -
Size - 270k records
Run Code Online (Sandbox Code Playgroud)
编辑 - 如果不清楚,视图将返回270k记录.
没有连接的查询stg_scd
需要几秒钟,看起来它是导致性能问题的部分,视图也会以秒为单位运行,尽管它正在加入到1亿个记录表中.现在,查询占用的时间在12到30分钟之间,取决于我们的来源有多繁忙.
这是执行计划:
6 | 0 | SELECT STATEMENT | | 3278K| 1297M| 559K (4)| 02:10:37 | | | | | |
7 | 1 | PX COORDINATOR | | | | | | | | | | |
8 | 2 | PX SEND QC (RANDOM) | :TQ10003 | 3278K| 1297M| 559K (4)| 02:10:37 | | | Q1,03 | P->S | QC (RAND) |
9 |* 3 | HASH JOIN OUTER | | 3278K| 1297M| 559K (4)| 02:10:37 | | | Q1,03 | PCWP | |
10 | 4 | PX RECEIVE | | 29188 | 10M| 50662 (5)| 00:11:50 | | | Q1,03 | PCWP | |
11 | 5 | PX SEND HASH | :TQ10002 | 29188 | 10M| 50662 (5)| 00:11:50 | | | Q1,02 | P->P | HASH |
12 |* 6 | HASH JOIN RIGHT OUTER | | 29188 | 10M| 50662 (5)| 00:11:50 | | | Q1,02 | PCWP | |
13 | 7 | BUFFER SORT | | | | | | | | Q1,02 | PCWC | |
14 | 8 | PX RECEIVE | | 29188 | 370K| 50575 (5)| 00:11:49 | | | Q1,02 | PCWP | |
15 | 9 | PX SEND BROADCAST | :TQ10000 | 29188 | 370K| 50575 (5)| 00:11:49 | | | | S->P | BROADCAST |
16 | 10 | VIEW | V_CRM_CASE_ID_EXISTS_IN_DWH | 29188 | 370K| 50575 (5)| 00:11:49 | | | | | |
17 |* 11 | HASH JOIN | | 29188 | 399K| 50575 (5)| 00:11:49 | | | | | |
18 | 12 | TABLE ACCESS FULL | CRM_PS_RC_CASE | 29188 | 199K| 570 (1)| 00:00:08 | | | | | |
19 | 13 | INDEX FAST FULL SCAN| DIM_CRM_CASES$1PK | 103M| 692M| 48894 (3)| 00:11:25 | | | | | |
20 | 14 | PX BLOCK ITERATOR | | 29188 | 10M| 87 (2)| 00:00:02 | | | Q1,02 | PCWC | |
21 | 15 | TABLE ACCESS FULL | STG_DIM_CRM_CASES | 29188 | 10M| 87 (2)| 00:00:02 | | | Q1,02 | PCWP | |
22 | 16 | BUFFER SORT | | | | | | | | Q1,03 | PCWC | |
23 | 17 | PX RECEIVE | | 515M| 14G| 507K (3)| 01:58:28 | | | Q1,03 | PCWP | |
24 | 18 | PX SEND HASH | :TQ10001 | 515M| 14G| 507K (3)| 01:58:28 | | | | S->P | HASH |
25 | 19 | PARTITION RANGE ALL | | 515M| 14G| 507K (3)| 01:58:28 | 1 | 2982 | | | |
26 | 20 | TABLE ACCESS FULL | STG_SCD_CUSTOMERS_KEY | 515M| 14G| 507K (3)| 01:58:28 | 1 | 2982 | | | |
27 ------------------------------------------------------------------------------------------------------------------------------------------------------------
28
29 Predicate Information (identified by operation id):
30 ---------------------------------------------------
31
32 3 - access("STG_DIM_CRM_CASES"."ACCOUNT_NUMBER"="STG_SCD_CUSTOMERS_KEY"."ACCOUNT_NUMBER"(+))
33 filter("STG_DIM_CRM_CASES"."CASE_CREATE_DATE">="STG_SCD_CUSTOMERS_KEY"."START_DATE"(+) AND
34 "STG_DIM_CRM_CASES"."CASE_CREATE_DATE"<="STG_SCD_CUSTOMERS_KEY"."END_DATE"(+))
35 6 - access("STG_DIM_CRM_CASES"."CRM_CASE_ID"="V_CRM_CASE_ID_EXISTS_IN_DWH"."CASE_ID"(+))
36 11 - access("T"."CASE_ID"="X"."CRM_CASE_ID")
Run Code Online (Sandbox Code Playgroud)
注意:添加索引可能是一个问题,取决于索引.这不是这个表的唯一使用位置,因此索引可能会干扰这些表上的其他命令(大多数是Insert).
我也尝试添加过滤器stg_scd
并排除小于最小日期的所有日期Table_Cases
,但这没有帮助,因为它只过滤了1年的记录.
提前致谢.
问题出在扫描所有分区时:
18 | 18 PX 发送哈希 | :TQ10001 | 515M| 14G| 507K (3)| 01:58:28 | 01:58:28 | | | S->P | 哈希 | 25 | 25 19 | 19 分区范围全部|
| 515M| 14G| 507K (3)| 01:58:28 | 01:58:28 1 | 2982 | 2982 |
| | 26 | 26 20 | 桌子访问完全| STG_SCD_CUSTOMERS_KEY | 515M| 14G|
发生这种情况是因为您正在对该表使用左连接。您可以使用绑定变量选择 1 个分区吗?什么是分区键?我没有看到并行的提示,但根据您的计划,它使用并行。任何对象层面上都存在平行度吗?您可以删除并行并发布没有并行的解释计划吗?