考虑对日期列进行索引的表的以下两个查询-
Q1: select * from table where datecolumn > sysdate - 5;
Q2: select * from table where datecolumn > sysdate - 5 and datecolumn < sysdate - 1;
Q1使用索引。但是,Q2以某种方式进行了全表扫描。是因为oracle选择先执行"datecolumn<sysdate-1"吗?在这种情况下,有没有办法强制执行涉及一列的where子句的执行顺序?
您可以指定一个索引提示,如下所示:
select /*+ INDEX (table datecolumn_ix)*/
*
from table
where datecolumn > sysdate - 5 and datecolumn < sysdate - 1;
有关更多详细信息,请参阅Oracle索引提示。
当然有index
提示。
/*+ INDEX(table index_name) */
但是,在你的情况下,也许最好收集你的表格的统计数据。
使用DBMS_STATS.GATHER_TABLE_STATS("schema","TABLE")过程。
Oracle默认情况下不会保证您的表将按照您提到的相同顺序连接,因此您可以使用以下提示:
-
已订购https://docs.oracle.com/cd/B10500_01/server.920/a96533/hintsref.htm#5555它将按照您在中提到的相同顺序连接您的表,其中语句
-
领先https://docs.oracle.com/cd/B10500_01/server.920/a96533/hintsref.htm#5730您可以指定表的联接顺序
select /*+ leading (c b a) */ a.* from tablea a , tableb b , tablec c where a.some_id = b.some_id and c.some_id = b.other_id
此外,对于您的Q2,您可以尝试
between
选项https://docs.oracle.com/cd/B28359_01/server.111/b28286/conditions011.htm