【问题标题】:Optimizing an Oracle SQL Query for Faster Results优化 Oracle SQL 查询以获得更快的结果
【发布时间】:2021-12-06 16:10:54
【问题描述】:

我正在尝试创建一个新表来获取过去 7 天的数据 - 从一个包含数百万行每日数据的表中 Oracle SQL 和其他 2 个表只是为了获取项目id 和商店 id。它甚至不再运行,因为它太大了。我该如何编写才能更好地优化它?

CREATE TABLE NEW_TABLE PARALLEL 6 as
SELECT 
        A.DATE_DT,
        B.STORE_NUM,
        C.ITEM_ID,
        A.BALANCE_ONHAND,
        A.DEMAND,
        A.PENDING_DELIVERY            
FROM TABLE.QTY A,
      TABLE.STORES B,
      TABLE.ITEMS C,
     (SELECT DATE_DT FROM DAY WHERE DATE_DT BETWEEN TRUNC(SYSDATE-6) and TRUNC(SYSDATE)) D
WHERE A.ITEM_ID = C.ITEM_ID 
      AND A.STORE_NUM = B.STORE_NUM
      AND A.DATE_DT = D.DATE_DT
order by A.DATE_DT;

这是每个表中的列:

TABLE.QTY

A.DATE_DT,
A.ITEM_ID,
A.STORE_NUM,
A.BALANCE_ONHAND,
A.DEMAND,
A.PENDING_DELIVERY  

TABLE.STORES (the stores that I only want to see which is why it's a separate table) 
STORE_NUM

TABLE.ITEMS (the items that I only want to see which is why it's a separate table)
ITEM_ID

DAY
It's a pre-made table by Oracle with Day dates.

我对任何事情都持开放态度。最终我计划在我的alation上安排这个查询,这样它每周都会创建一个新表。

【问题讨论】:

  • 分享你的表索引细节以及查询执行计划
  • 还有你为什么要排序?摆脱订单,似乎没有必要
  • 我在这些表上没有太多列。这些是我需要的唯一列。最终,我希望每周创建此表,以便仅查看过去 7 天的数据。
  • 桌子上的行就像篮子里的球。他们没有秩序。因此,尝试在插入上“排序”是零意义的。 “完成”的唯一事情是强制驱动 SELECT 在将结果插入到表中之前完成对结果进行排序的额外工作,其中订单不再存在。也许这种不必要的排序是您性能问题的重要组成部分。我想看看你引用的文章的引用。
  • A.DATE_DT 上的直接过滤器将比连接快得多,因为您使用 inner join 并且不使用日历表中的其他属性。但是只有发布实际执行计划才能提供真正的答案,可能会通过dbms_sql_monitor.report_sql_monitorformat => 'ALL ALLSTATS LAST'收集

标签: sql oracle optimization oracle-sqldeveloper


【解决方案1】:

如果没有执行计划,就无法真正评价性能。假设您有外键,那么与其他表的连接似乎是不必要的。你可以试试这样的:

CREATE TABLE NEW_TABLE PARALLEL 6 as
SELECT 
        A.DATE_DT,
        A.STORE_NUM,
        A.ITEM_ID,
        A.BALANCE_ONHAND,
        A.DEMAND,
        A.PENDING_DELIVERY            
FROM TABLE.QTY A
WHERE A.DATE_DT BETWEEN TRUNC(SYSDATE-6) and TRUNC(SYSDATE);

我怀疑如果你在 DATE_DT 上没有索引,你会想要一个。

你说你每周都要重新创建这张表?听起来您想要的是物化视图,而不是表格。你可以每周刷新一次。

【讨论】:

    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2017-02-09
    • 2023-03-08
    • 2017-11-15
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多