优化Oracle SQL查询以获得更快的结果



我正在尝试创建一个新的表来获取数据从过去的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上调度这个查询,以便它每周创建一个新表。

在没有执行计划的情况下评论性能是不可能的。假设有了外键,那么与其他表的连接似乎就没有必要了。您可以尝试这样做:

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的索引,你会想要一个。

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

最新更新