0

考虑对 datecolumn 进行索引的表上的以下两个查询 -

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 子句的执行顺序?

4

3 回答 3

0

您可以指定索引提示,如下所示:

select /*+ INDEX (table datecolumn_ix)*/ 
       * 
  from table 
  where datecolumn > sysdate - 5 and datecolumn < sysdate - 1;

有关详细信息,请参阅Oracle 索引提示。

于 2013-02-21T06:16:20.390 回答
0

当然有index 提示

/*+ INDEX(table index_name) */

但是,在您的情况下,收集表的统计信息可能会更好。

使用DBMS_STATS.GATHER_TABLE_STATS('schema','table')过程。

于 2013-02-21T06:16:33.873 回答
0

默认情况下,Oracle 不保证您的表将按照您提到的顺序加入,因此您可以使用以下提示:

  1. 订购 https://docs.oracle.com/cd/B10500_01/server.920/a96533/hintsref.htm#5555 它将按照您在where语句中提到的顺序加入您的表格

  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

于 2020-01-23T09:40:33.160 回答