在Oracle中使用日期索引

0 sql oracle

我有一个查询以检索货运信息。

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

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


该表包含约180.000行,并且两个sql都检索50行。但是,当我运行解释计划时,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 )

Jon*_*ler 5

通常,您应该信任优化器来了解其业务,这正在优化查询的性能。特别是,您应该期望优化器知道何时使用索引将是有益的,何时使用索引将无益。如果使用索引不会提高查询性能,那么优化器将不会使用它。

因此,您有一些疑问:

  1. 查询运行太慢吗?(如果没有,您为什么担心?)
  2. 表的架构是什么?
  3. 表上的索引是什么?
  4. 有问题的表的基数是什么?
  5. 完整查询到底是什么样的?
  6. 查询计划是什么样的?
  7. 表中哪些行满足shipment.end_alloc_date >= to_date(last week)
  8. 表中哪些行满足shipment.end_alloc_date <= to_date(next week)

您是否注意到这些条件不是彼此相反的?我假设是这样,但这意味着一个最佳查询计划可能与另一个最佳查询计划不同。

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