sql - Oracle group by 和 OR 查询优化
问题描述
SELECT BATCH_ID,
BU_CODE,
BU_TYPE,
BATCH_TYPE,
BATCH_GROUP_ID,
STATUS,
UPD_DTIME
FROM BATCH_T
WHERE (BU_CODE, BU_TYPE, BATCH_TYPE, UPD_DTIME) IN
(SELECT BU_CODE,
BU_TYPE,
BATCH_TYPE,
MAX(UPD_DTIME)
FROM BATCH_T
WHERE STATUS = 'CLOSED'
GROUP BY BU_CODE,
BU_TYPE,
BATCH_TYPE
)
OR UPD_DTIME >= SYSDATE - 5;
如上面没有 OR 条件的 Oracle Query 它给出快速响应,但有 OR 条件它需要这么多时间。您能否帮助如何提高上述查询的响应时间。
解决方案
您需要最后关闭的记录以及过去五天的所有内容。使用窗口函数!
SELECT b.*
FROM (SELECT b.*,
ROW_NUMBER() OVER (PARTITION BY BU_CODE, BU_TYPE, BATCH_TYPE, STATUS ORDER BY UPD_DTIME DESC) as seqnum
FROM BATCH_T b
) b
WHERE UPD_DTIME >= SYSDATE - 5 OR
(STATUS = 'CLOSED' AND seqnum = 1);
这应该比使用IN
/EXISTS
和聚合的任何方法都快。写起来也比较简单。
推荐阅读
- git - 强制推送到不同的分支时,Git 不会将新文件推送到远程
- sml - 在 SML 中将 int 转换为 real
- sql - 使用动态列名 SQL Server 连接
- c - ~(char)((unsigned char) ~0 >> 1) 到底发生了什么?
- javascript - 是否可以使用 ajax 执行任何 php 函数
- c# - 登录到第二个表单后如何传递名称变量
- javascript - 标签内容文件图像预览脚本不起作用
- html - Django - 一个 href 重复目标
- docker - 应用程序依赖于为环境变量采购 secrets.sh。如何在我的 Dockerfile 中实现这一点?
- jquery - 单击其他div链接时关闭div jquery