我在db中有一个巨大的日志表。 log_id和log_date都有一个索引。
当我以相反的顺序查询日志时,需要“永远”完成。 虽然我在没有订单的情况下执行相同的查询,但答案是立竿见影的。
如何调整表/改进查询以进行快速(呃)反向选择?
编辑:查询(对不起,这个问题在我看来很明显(在Florin中也是如此!):
select * from logs ordered by log_date desc
一些指标:
表格中有大约4千万行
select * from logs where log_id < 500
- &GT;在0.032秒内获取
select * from logs where log_id < 500 order by log_time desc;
- &GT;在大约20秒内取出
$ max是最大log_id,并且已在另一个查询中检索
select * from logs where log_id > ($max - 500);
- &GT;大约16秒钟取出
select * from logs where log_id > ($max - 500) order by log_time desc;
- &GT;大约16秒钟取出
我的问题是如何改进所有需要花费太多秒的查询。
@Florin
使用'where'子句缩小日志时间(where log_time >= truncate(sysdate))
我的表现很好,但我需要能够长时间选择日志或者过去远远的范围。在这种情况下,查询仍然很慢(如20秒)。
答案 0 :(得分:3)
select * from log_table
where log_date >= trunc(sysdate) --current_day
order by log_id desc, log_date desc
这将在log_date索引中执行范围扫描,并将从log_table而不是整个表中检索一天的行。 在此之后,排序将更快,因为将排序很少的行。
<强>更新强> 你可以做的另一件事:
NOT NULL
(这可能会将优化器更改为
使用索引); /*+parallel(logs 8)*/
提示(如果你不开枪)
这个查询过于频繁,只需要在数据库工具中快速获得结果。如果你有很多处理器:))