是否有以特定顺序执行where子句的oracle提示



考虑对日期列进行索引的表的以下两个查询-

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默认情况下不会保证您的表将按照您提到的相同顺序连接,因此您可以使用以下提示:

  1. 已订购https://docs.oracle.com/cd/B10500_01/server.920/a96533/hintsref.htm#5555它将按照您在中提到的相同顺序连接您的表,其中语句

  2. 领先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

最新更新