在Oracle中使用日期索引

时间:2012-01-03 13:27:47

标签: sql oracle

我有一个检索货件信息的查询。

我希望能够在日期列上使用索引。此列的where子句类似于shipment.end_alloc_date >= to_date( last week )。 当我添加shipment.end_alloc_date <= to_date( next week )时,使用索引。但是,我不想使用第二行。

是否有人知道如何强制Oracle仅使用第一个限制来使用此日期索引?


该表包含大约180.000行,并且两个sql检索50行。但是,当我运行explain plan时,end_alloc_date上的索引仅用于第二个sql。为了迫使Oracle使用索引,我能做些什么?

1)select <some data> from shipment where shipment.end_alloc_date >= to_date( last week )

2)select <some data> from shipment where shipment.end_alloc_date >= to_date( last week ) and shipment.end_alloc_date <= to_date( next week )

2 个答案:

答案 0 :(得分:4)

一般来说,您应该相信优化器能够了解其业务,从而优化查询的性能。特别是,您应该期望优化器知道何时使用索引是有益的,何时这样做是不利的。如果使用索引不会使查询的性能受益,那么优化器将不会使用它。

所以,有些问题要问你:

  1. 查询运行得太慢了吗? (如果不是,你为什么担心?)
  2. 表的架构是什么?
  3. 桌子上有哪些索引?
  4. 相关表格的基数是什么?
  5. 完整查询究竟是什么样的?
  6. 查询计划是什么样的?
  7. 表中有多少行符合shipment.end_alloc_date >= to_date(last week)
  8. 表中有多少行符合shipment.end_alloc_date <= to_date(next week)
  9. 您是否注意到这些条件并非彼此相反?我假设如此,但这意味着一方的最佳查询计划可能与另一方的最佳查询计划不同。

    优化器将考虑该列表中问题2-8的答案,并使用其判断来选择回答查询的最佳方式。如果您认为优化器失败,您必须知道这些问题的答案。但是如果没有这些信息,这里没有人可以为你提供很多帮助,除了模糊的挥手之外“在手册中寻找优化提示”。

答案 1 :(得分:2)

使用索引是运行查询的最快方法,这是一种误解。

我预计,当仅指定'shipment.end_alloc_date&gt; = to_date(上周)'时,优化器已决定不使用索引更有效。

例如,如果该查询产生许多行,那么优化程序很可能已选择此路由,因为它使用索引的效率更高 。它可以选择全表扫描,因为它可以更快地读取可靠的数据块,而不是从索引中读取rowid。