Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何提高大型表的select性能_Sql_Oracle_Performance_Indexing_Oracle11g - Fatal编程技术网

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