0

datecolumnがインデックス付けされているテーブルに対する次の2つのクエリについて考えてみます-

Q1: select * from table where datecolumn > sysdate - 5;
Q2: select * from table where datecolumn > sysdate - 5 and datecolumn < sysdate - 1;

Q1はインデックスを使用します。しかし、Q2はどういうわけか全表スキャンを行います。オラクルがどういうわけか最初に「datecolumn<sysdate-1」を実行することを選択したからですか?その場合、1つの列を含むwhere句の実行順序を強制する方法はありますか?

4

3 に答える 3

0

次のようなインデックスヒントを指定できます。

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

詳細は、 『 Oracle Index Hint 』を参照してください。

于 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#5555whereステートメント説明 したのと同じ順序でテーブルを結合します

  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
    

    また、第2四半期には、betweenオプション https://docs.oracle.com/cd/B28359_01/server.111/b28286/conditions011.htmを試すことができます。

于 2020-01-23T09:40:33.160 に答える