【发布时间】:2012-06-13 21:12:28
【问题描述】:
我在数据库中有一个巨大的日志表。 log_id 和 log_date 上有一个索引。
当我以相反的顺序查询日志时,需要“永远”才能完成。 虽然我在没有顺序的情况下进行相同的查询,但答案是立竿见影的。
如何调整表/改进查询以进行快速(呃)反向选择?
编辑:查询(对不起,查询在我的脑海中很明显(在弗洛林也是如此!):
select * from logs ordered by log_date desc
一些指标:
表中有大约 4000 万行
select * from logs where log_id < 500
--> 0.032 秒内获取
select * from logs where log_id < 500 order by log_time desc;
--> 大约 20 秒内获取
$max 是最大的 log_id,它已在另一个查询中检索到
select * from logs where log_id > ($max - 500);
--> 大约 16 秒内获取
select * from logs where log_id > ($max - 500) order by log_time desc;
--> 大约 16 秒内获取
我的问题是如何改进所有执行时间过长的查询。
@弗洛林
使用 'where' 子句缩短登录时间(where log_time >= truncate(sysdate)) 我有很好的性能,但我需要能够选择很长一段时间或过去很远的范围内的日志。在这种情况下,查询仍然很慢(比如 20 秒)。
【问题讨论】:
-
查看 dba.se 上的反向键索引 this answer 以及可能的 IOT 以获取“严重”
change the DB答案。不过可能有更简单的方法。您是否考虑过物化视图? -
如果您不提供查询或架构,您希望我们猜测还是通灵?
-
@Ben,反向键索引与在这种情况下的帮助完全相反(RK 索引没有按相反顺序排序,键值本身是字节反转的,这有效地将值分散在指数)。 Oracle 可以在任一方向上遍历普通索引。
-
@Dems,不是通灵者,我希望你聪明;)(我在开玩笑,我觉得自己像个白痴一样没有提供查询)
-
select * from logs where log_id < ($max - 500);应该是select * from logs where log_id > ($max - 500);
标签: sql performance oracle