Sql 如何提高大型表的select性能
我目前有一个过程,是采取龙眼小时+- 这个过程基本上是这样做的: 首先,它保留了从一个表到一个视图的连接-Sql 如何提高大型表的select性能,sql,oracle,performance,indexing,oracle11g,Sql,Oracle,Performance,Indexing,Oracle11g,我目前有一个过程,是采取龙眼小时+- 这个过程基本上是这样做的: 首先,它保留了从一个表到一个视图的连接- SELECT * FROM STG_CRM, V_CRM WHERE STG_CRM.CRM_CASE_ID=V_CRM.CASE_ID(+) 视图DDL: create or replace view stg_admin.v_crm as select t.case_id from crm_case t, dim_crm x where t.case_id=x.crm_c
SELECT * FROM
STG_CRM, V_CRM
WHERE
STG_CRM.CRM_CASE_ID=V_CRM.CASE_ID(+)
视图DDL:
create or replace view stg_admin.v_crm as
select t.case_id
from crm_case t, dim_crm x
where t.case_id=x.crm_case_id;
STG_CRM-200k记录-无索引
DIM_CRM-90MIL记录-索引CRM_案例id-唯一
CRM_案例-200k记录-无索引
到目前为止,一切都还不算繁重,大约需要2-3分钟,然后还有一个左连接到另一个视图,这是当前最重的选择,从视图中选择*是10分钟
查看DDL-我目前正在考虑两个不同的查询:
select t.crm_case_id,s.customer_key
from stg_crm t, stg_scd s
where t.account_number=s.account_number
and t.case_create_date between s.start_date and s.end_date;
或:
表stg_scd-500 mil记录索引的客户密钥、开始日期、结束日期-每天按结束日期进行唯一分区
现在这两个查询都需要很长的时间,第二个要长一点。我的猜测是因为它没有使用索引,因为开始日期没有用于过滤,但我不知道如何添加它
我的问题是:我怎样才能使它更快?如果我在create_date在STG_CRM上添加索引,会有帮助吗?我甚至不知道DBA是否允许at,因为这是一个小表
限制:
我无法更改大表STG_SCD上的索引
我可能能够在其他表上添加索引,但只有给出一个很好的理由,因为它会影响使用此表的其他进程的性能。
隐式连接语法是通过我的程序生成的,因此不需要在那里添加注释
提前多谢
另外,第一个select left连接到第二个select大约需要30-60分钟。由于您在第二个查询选项中从一个非常大的表中聚合数据,因此使用query_rewrite提前计算这些值的结果可能会获得一些性能优势。这里有一篇文章介绍了此功能的使用- 您还可以找到许多其他使用此功能的最佳实践示例,它在优化数据仓库查询方面非常有价值
祝你好运 我设法解决了这个问题 我错过了两件事: 1关于stg_scd的统计信息,我们在向表中添加分区后禁用了它,在添加每个分区后忘记添加统计信息 2在stg客户关系管理中添加账户编号、案例创建日期的索引
感谢您的所有尝试:请,请,请,请迁移到使用ANSI标准联接并停止使用旧的Oracle逗号联接。@MT0请阅读下面的第3行,然后再这样说……我建议在stg\U crm帐号上创建一个索引,名为create IND1,案例创建日期,可能更重要的是在stg客户关系管理账号上创建索引IND2
select t.crm_case_id,
(select min(s.customer_key) keep (dense_rank first order by s.end_date asc)
from stg_scd s
where t.account_number = s.account_number and
t.case_create_date <= s.end_date
) as customer_key
from stg_crm t