需要 SQL 查询调优建议

问题描述 投票:0回答:1

我在 Oracle 数据库中有一个客户表,截至今天已有 1000 万条记录。每天都会在客户表顶部创建一个视图,例如 customer_1001,下面是示例视图定义。

创建视图 customer_1001 作为 从客户a中选择<60 columns> 其中 trunc(a.create_dt)=(从客户中选择 max(trunc(a.create_dt))) ;

Customer 表仅在 Cust_ID 和 create_dt 上具有复合 PK,并且在 DDL 定义中没有定义任何其他选项。

您能否建议我如何调整 Customer 表 DDL 以在视图顶部快速获取查询结果。

我们在 ETL 过程中多次查询视图。请帮助我。

sql oracle performance query-optimization
1个回答
0
投票

首先,如果您只想使用您共享的逻辑获取最新的负载,您可能想尝试窗口功能:

    select *
      from (select /*+ parallel(8) */
                   c.*,
                   RANK(TRUNC(create_dt)) OVER (ORDER BY create_dt DESC) seq
             from customer c)
     where seq = 1

但是,您正在创建视图表明您还有其他打算使用该视图的查询。这些查询完全改变了您的需求,因此您必须分享它们,以便提供更多建议。如果您要查询特定的客户 ID,那么您需要确保您的窗口函数按该列进行分区:

    create view myview as
    select *
      from (select c.*,
                   RANK(TRUNC(create_dt)) OVER (PARTITION BY customer_id ORDER BY create_dt DESC) seq
             from customer c)
     where seq = 1;

     select * from myview where customer_id = 1234;

如果您打算通过其他过滤器进行查询,则需要调整视图中要使其性能良好所需的逻辑。当两者一起考虑时,针对视图的每个顶级查询都会生成一个全新的、不同的 SQL。无论如何使用,都无法使视图始终表现良好。

© www.soinside.com 2019 - 2024. All rights reserved.