我有一个查询以检索货运信息。
我希望能够在日期列上使用索引。此列的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 )
通常,您应该信任优化器来了解其业务,这正在优化查询的性能。特别是,您应该期望优化器知道何时使用索引将是有益的,何时使用索引将无益。如果使用索引不会提高查询性能,那么优化器将不会使用它。
因此,您有一些疑问:
shipment.end_alloc_date >= to_date(last week)?shipment.end_alloc_date <= to_date(next week)?您是否注意到这些条件不是彼此相反的?我假设是这样,但这意味着一个最佳查询计划可能与另一个最佳查询计划不同。
优化器将考虑该列表中问题2-8的答案,并使用其判断力来选择回答查询的最佳方法。如果您认为优化器失败,则必须知道这些问题的答案。但是,如果没有这些信息,除了模糊的“寻找手册中的优化程序提示”之外,这里没有人能为您提供很多帮助。