2

您能否分享一些关于如何优化我在 Oracle (11G) 数据库中的查询的信息?

在我的数据库中,我有 10 个临时表(TemporalTable_1 到 TemporalTable_10),其中的架构类似于以下内容:

Create table TemporalTable_1 (
    Customer_ID number(8),
    < Other columns>
    valid_period_start timestamp, 
    valid_period_end timestamp, 
    period for valid_period(valid_period_start, valid_period_end)
)

每个表都有以下两个索引和...

Create index ind_TemporalTable_1_ID on TemporalTable_1 (Customer_ID);

Create index ind_TemporalTable_1_Period on TemporalTable_1 (valid_period_start, valid_period_end);

...查看特定日期的结果

Create or replace view TemporalTable_1_20200707 as
    select 
        * 
    from 
        TemporalTable_1 as of period for valid_period to_date('20200707','yyyymmdd');

TemporalTable_2 到 TemporalTable_10 也具有与 TemporalTable_1 相似的索引和视图。

现在,我创建了一个视图,将截至 2020 年 7 月 7 日的所有时态表连接在一起。

Crete view All_Temporals_20200707 as 
select
    * 
from
    TemporalTable_1_20200707 TT1
    left join TemporalTable_2_20200707 TT2 on
        TT2.Customer_id = TT1.Customer_id
    left join TemporalTable_3_20200707 TT3 on
        TT2.Customer_id = TT3.Customer_id
    left join TemporalTable_4_20200707 TT4 on
        TT3.Customer_id = TT4.Customer_id
    left join TemporalTable_5_20200707 TT5 on
        TT4.Customer_id = TT5.Customer_id
    left join TemporalTable_6_20200707 TT6 on
        TT5.Customer_id = TT6.Customer_id
    left join TemporalTable_7_20200707 TT7 on
        TT6.Customer_id = TT7.Customer_id
    left join TemporalTable_8_20200707 TT8 on
        TT7.Customer_id = TT8.Customer_id
    left join TemporalTable_9_20200707 TT9 on
        TT8.Customer_id = TT9.Customer_id
    left join TemporalTable_10_20200707 TT10 on
        TT9.Customer_id = TT10.Customer_id

我发现视图的性能很糟糕。而且我只是不知道如何提高查询的性能。“解释计划”的结果表明 Oracle 不会使用这些索引。对于视图“All_Temporals_20200707”

执行计划为

我还修改了正在查看的查询如下

select /*+  INDEX(TemporalTable_1.IND_TemporalTable_1_PERIOD) */
        *
    from 
        TemporalTable_1 as of period for valid_period sysdate; -- today is 07 JUL 2020

但是,它没有区别。这意味着我创建的所有索引都没有被使用。

有人可以在这里与我分享一些关于我应该如何解决性能问题的信息吗?

提前致谢!

只是在这里提供一些背景知识,这实际上是尝试在日常基础中创建整个数据库的快照以用于报告服务。“All_Temporals_20200707”实际上是对现实世界中报告之一的查询。这也意味着 Customer_Id 实际上是生产数据库中某些表的主键。

4

0 回答 0