1

我在数据库中有一个巨大的日志表。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 秒内获取

我的问题是如何改进所有需要太多秒执行的查询。

@Florin
使用“where”子句缩短了登录时间(where log_time >= truncate(sysdate)),我的性能很好,但我需要能够选择很长一段时间内的日志或过去很长一段时间内的日志。在这种情况下,查询仍然很慢(比如 20 秒)。

4

1 回答 1

3
select * from log_table 
where log_date >= trunc(sysdate)  --current_day
order by log_id desc, log_date desc

这将在 log_date 索引中进行范围扫描,并将从 log_table 中检索一天的行,而不是整个表。在此之后,排序会更快,因为要排序的行数很少。

更新: 您可以做的另一件事:

  • 制作 log_date 列NOT NULL(这可能会更改优化器以使用索引);
  • 使用/*+parallel(logs 8)*/提示(如果您不经常执行此查询并且只需要在您的数据库工具中快速获得结果。如果您有很多处理器:))
  • 您可以按月或更详细的方式对表进行分区。
于 2012-06-14T05:43:21.147 回答