ORACLE 视图查询慢求解

lipiaolpt 2024-06-25 23:53:16

视图view1有3个字段 id,updatetime,enabled  3个字段

select * from view1 a where  a.enabled=‘Y’;

表数据是千万级,上面的语句执行很快

需要获取同id号的最新的updatetime,用下面的语句非常非常慢,

各位大神,是否有其他写法的呢

select 

id,

(select max(b.updatetime) from  view1 b where b.id= a.id) updatetime

 from view1 a.enabled=‘Y’;

 

...全文
672 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
McRfee 02-05
  • 打赏
  • 举报
回复

SELECT a.id, a.updatetime
FROM view1 a
JOIN (
SELECT id, MAX(updatetime) AS max_updatetime
FROM view1
WHERE enabled = 'Y'
GROUP BY id
) b ON a.id = b.id AND a.updatetime = b.max_updatetime
WHERE a.enabled = 'Y';
要先根据enabled='Y'先筛一遍

雪梨篮儿 2024-06-30
  • 打赏
  • 举报
回复

注意语句的执行顺序,老师讲过,先把能过滤更多内容的语句优先执行,

  • 打赏
  • 举报
回复

要提高查询效率,可以尝试几种优化方法。以下是几种常见的解决方案:

  1. 使用分析函数(窗口函数)
    Oracle 的分析函数可以显著提高这种查询的效率。使用 ROW_NUMBER() 窗口函数可以获取每个 id 对应的最新 updatetime。下面是优化后的查询:

SELECT id, updatetime
FROM (
SELECT id, updatetime,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatetime DESC) as rn
FROM view1
WHERE enabled = 'Y'
)
WHERE rn = 1;
2. 使用 JOIN 结合子查询
如果分析函数在你的环境中效果不好,或者你更习惯传统的 SQL 查询方式,可以尝试使用子查询和 JOIN 结合的方法:

SELECT a.id, a.updatetime
FROM view1 a
JOIN (
SELECT id, MAX(updatetime) AS max_updatetime
FROM view1
WHERE enabled = 'Y'
GROUP BY id
) b ON a.id = b.id AND a.updatetime = b.max_updatetime
WHERE a.enabled = 'Y';
3. 索引优化
确保你在 id 和 enabled 字段上创建了合适的索引,以提高查询性能。以下是创建索引的示例:

CREATE INDEX idx_view1_id_enabled ON view1(id, enabled);
CREATE INDEX idx_view1_updatetime ON view1(updatetime);
4. 使用 EXISTS 子查询
另一种优化方法是使用 EXISTS 子查询:

SELECT a.id, a.updatetime
FROM view1 a
WHERE a.enabled = 'Y'
AND NOT EXISTS (
SELECT 1
FROM view1 b
WHERE b.id = a.id
AND b.updatetime > a.updatetime
AND b.enabled = 'Y'
);
总结
使用分析函数或 JOIN 方法通常可以显著提高查询性能,同时确保在相关字段上有合适的索引。你可以根据实际情况测试不同的方法,选择性能最好的方案。

希望这些优化方法能帮助你提高查询性能!

崔灸舞 2024-06-26
  • 打赏
  • 举报
回复

SELECT DISTINCT ON (id)
id,
updatetime
FROM (
SELECT
id,
updatetime,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatetime DESC) AS rn
FROM view1
WHERE enabled = 'Y'
) AS subquery
WHERE rn = 1;

河狸吗 2024-06-26
  • 打赏
  • 举报
回复 2

select id,max(updatetime) updatetime
from view1 a
where a.enabled = 'Y'
group by id

17,137

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧