我有一个检索货件信息的查询。
我希望能够在日期列上使用索引。此列的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 )
答案 0 :(得分:4)
一般来说,您应该相信优化器能够了解其业务,从而优化查询的性能。特别是,您应该期望优化器知道何时使用索引是有益的,何时这样做是不利的。如果使用索引不会使查询的性能受益,那么优化器将不会使用它。
所以,有些问题要问你:
shipment.end_alloc_date >= to_date(last week)
?shipment.end_alloc_date <= to_date(next week)
?您是否注意到这些条件并非彼此相反?我假设如此,但这意味着一方的最佳查询计划可能与另一方的最佳查询计划不同。
优化器将考虑该列表中问题2-8的答案,并使用其判断来选择回答查询的最佳方式。如果您认为优化器失败,您必须知道这些问题的答案。但是如果没有这些信息,这里没有人可以为你提供很多帮助,除了模糊的挥手之外“在手册中寻找优化提示”。
答案 1 :(得分:2)
使用索引是运行查询的最快方法,这是一种误解。
我预计,当仅指定'shipment.end_alloc_date&gt; = to_date(上周)'时,优化器已决定不使用索引更有效。
例如,如果该查询产生许多行,那么优化程序很可能已选择此路由,因为它使用索引的效率更高 。它可以选择全表扫描,因为它可以更快地读取可靠的数据块,而不是从索引中读取rowid。