我在Oracle数据库中有一个名为my_table的表,例如。它是日志表的类型。它有一个增量列,其名称为“id”和“registration_number”,它是注册用户的唯一。现在,我想注册用户最新的变化,所以我写了下面的查询来完成这个任务:选择最优化查询
第一个版本:
SELECT t.*
FROM my_table t
WHERE t.id =
(SELECT MAX(id) FROM my_table t_m WHERE t_m.registration_number = t.registration_number
);
第二个版本:
SELECT t.*
FROM my_table t
INNER JOIN
(SELECT MAX(id) m_id FROM my_table GROUP BY registration_number
) t_m
ON t.id = t_m.m_id;
我的第一个问题是上面哪个查询是推荐的,为什么?第二个是如果有时候大约有70.000个插入到这个表中,但是大多数插入行的数量在0到2000之间变化,那么向这个表中添加索引是否合理?
感谢您的回答。实际上,起初我使用ROW_NUMBER()做了这个,但后来我认为这不是最好的方式,所以我尝试了其他方法来做到这一点。为什么认为它可能会更快? – 2013-04-24 06:05:36
我已经测试过,但速度较慢。感谢您的时间和索引建议 – 2013-04-24 06:25:28
我可以想象一下'max'查询会更快 - 如果oracle在索引上使用'min/max scan'。但是你在那里得到了一个组,并且我不确定oracle可以对组合索引执行最小/最大扫描。值得检查。 – haki 2013-04-24 08:57:41