SQL(Oracle):如何通过x desc改进排序选择

时间:2012-06-13 21:12:28

标签: sql performance oracle

我在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是最大lo​​g_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秒)。

1 个答案:

答案 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而不是整个表中检索一天的行。 在此之后,排序将更快,因为将排序很少的行。

<强>更新 你可以做的另一件事:

  • 制作log_date列NOT NULL(这可能会将优化器更改为 使用索引);
  • 使用/*+parallel(logs 8)*/提示(如果你不开枪) 这个查询过于频繁,只需要在数据库工具中快速获得结果。如果你有很多处理器:))
  • 您可以按月分区或更详细地分区。