sql - 优化 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
,你会想要一个。
你说你每周都要重新创建这张表?听起来您想要的是物化视图,而不是表格。您可以每周进行一次刷新。
推荐阅读
- ms-access - SQL查询中表名中的减号/连字符
- android - Navigation Component 在 Fragment 中初始化 NavController 的位置
- ruby-on-rails - 使用 bootstrap_form_for 创建用户时出现问题。(我正在使用设计)
- spring - 如何在 Spring 数据 mongo 查询中使用聚合和动态排序
- javascript - 自定义绘制导航不呈现 - React Native
- amazon-web-services - 通过 AWS SSM 代理命令设置 SSH 隧道
- visual-studio - .NET Core .csproj 在 vs Studio 2019 中缺少 .cs 文件的文件路径
- haskell - 在参数类型而不是函数类型中设置约束有什么作用?
- java - com.microsoft.azure.documentdb.DocumentClientException 日期标头不符合要求的格式
- c# - Dotnet core 3.1 和 Angular 9 的 AAD 注册