【发布时间】:2016-04-27 14:00:44
【问题描述】:
我需要提高我的视图性能,现在生成视图的 SQL 是:
select tr.account_number , tr.actual_collection_trx_date ,s.customer_key
from fct_collections_trx tr,
stg_scd_customers_key s
where tr.account_number = s.account_number
and trunc(tr.actual_collection_trx_date) between s.start_date and s.end_date;
表 fct_collections_trx 有 170k+-(每天变化)记录。
表 stg_scd_customers_key 有 4.3 亿条记录。
表 fct_collections_trx 的索引如下: (所有这些的单一索引)(ACCOUNT_NUMBER、SUB_ACCOUNT_NUMBER、ACTUAL_COLLECTION_TRX_DATE、COLLECTION_TRX_DATE、COLLECTION_ACTION_CODE)(唯一)和ENTRY_SCHEMA_DATE(正常)。 DDL:
alter table stg_admin.FCT_COLLECTIONS_TRX
add primary key (ACCOUNT_NUMBER, SUB_ACCOUNT_NUMBER, ACTUAL_COLLECTION_TRX_DATE, COLLECTION_TRX_DATE, COLLECTION_ACTION_CODE)
using index
tablespace STG_COLLECTION_DATA
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 80K
next 1M
minextents 1
maxextents unlimited
);
表结构:
create table stg_admin.FCT_COLLECTIONS_TRX
(
account_number NUMBER(10) not null,
sub_account_number NUMBER(5) not null,
actual_collection_trx_date DATE not null,
customer_key NUMBER(10),
sub_account_key NUMBER(10),
schema_key VARCHAR2(10) not null,
collection_group_code CHAR(3),
collection_action_code CHAR(3) not null,
action_order NUMBER,
bucket NUMBER(5),
collection_trx_date DATE not null,
days_into_cycle NUMBER(5),
logical_delete_date DATE,
balance NUMBER(10,2),
abbrev CHAR(8),
customer_status CHAR(2),
sub_account_status CHAR(2),
entry_schema_date DATE,
next_collection_action_code CHAR(3),
next_collectin_trx_date DATE,
reject_key NUMBER(10) not null,
dwh_update_date DATE,
delta_type VARCHAR2(1)
)
表 stg_scd_customers_key 有索引 : (SINGLE INDEX OF ALL OF THEM) (ACCOUNT_NUMBER,START_DATE,END_DATE)。 DDL:
create unique index stg_admin.STG_SCD_CUST_KEY_PKP on stg_admin.STG_SCD_CUSTOMERS_KEY (ACCOUNT_NUMBER, START_DATE, END_DATE);
这个表也是分区的:
partition by range (END_DATE)
(
partition SCD_CUSTOMERS_20081103 values less than (TO_DATE(' 2008-11-04 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
tablespace FCT_CUSTOMER_SERVICES_DATA
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 8M
next 1M
minextents 1
maxextents unlimited
)
表结构:
create table stg_admin.STG_SCD_CUSTOMERS_KEY
(
customer_key NUMBER(18) not null,
account_number NUMBER(10) not null,
start_date DATE not null,
end_date DATE not null,
curr_ind NUMBER(1) not null
)
我不能在大表上添加过滤器(需要所有日期范围),我不能使用物化视图。这个查询运行大约 20-40 分钟,我必须让它更快.. 我已经尝试过放弃 trunc,没有什么不同。
有什么建议吗?
解释计划:
【问题讨论】:
-
Probaby
trunc(tr.actual_collection_trx_date) between是弱点。 -
已经尝试删除它,似乎没有不同的@jarlh
-
返回多少行?传输大量数据可能需要一些时间...
-
大约 170k,取决于较小的表大小.. @jarlh
-
分区是如何定义的?也许这两个表及其索引的 DDL 会有所帮助。
标签: sql oracle performance select view