17,141
社区成员




视图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’;
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'先筛一遍
注意语句的执行顺序,老师讲过,先把能过滤更多内容的语句优先执行,
要提高查询效率,可以尝试几种优化方法。以下是几种常见的解决方案:
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 方法通常可以显著提高查询性能,同时确保在相关字段上有合适的索引。你可以根据实际情况测试不同的方法,选择性能最好的方案。
希望这些优化方法能帮助你提高查询性能!
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;
select id,max(updatetime) updatetime
from view1 a
where a.enabled = 'Y'
group by id