2017-01-02 6 views
0

のために、私は(SWcode,cdcardno)インデックスが句が二列

にインデックスを作成する場所での2値のスキャンをスキップして、私はこのクエリを実行します。

SELECT cd.* 
    FROM KS cd 
    where cd.cdcardno in ('6219862012953805') 
ORDER BY cd.ROWID 

とOracleの使用インデックススキャンをスキップし、それは本当です。このクエリを実行すると:

SELECT cd.* 
    FROM KS cd 
    where cd.cdcardno in ('6219861009150391','6219862012953805') 
ORDER BY cd.ROWID 

oracle useフルスキャン。私は理由を理解できない。

+0

スキップ・スキャンは、索引に2つ以上のフィールドがあり、1つ以上のフィールドを「スキップ」し、索引ツリーの下のフィールドから索引を「スキャン」する場合に選択できます。ヒストグラムやデータの分布に関しては、WHERE句でフィールドを1つだけ選択すると、スキップスキャンが必要なのは当然です。 – sandman

答えて

0

場合によっては、2つの実行計画の間で、1つが悪い場合ともう1つが悪化する場合もあります。 がリストの1番目の位置にあるインデックスを作成します。または、現在のインデックスの列の順序を反転するだけです。

+0

しかし、なぜこれが起こりますか?たとえば、最初の列に4つの異なる値がある場合、最初の問合せではoracle split tableを4つのサブ表に、2つ目の列に索引を付けてそれぞれを検索します。それは本当ですか?はいの場合、2番目の列に2つの値を入力すると、oracleはそのようなことをしません。 –

+0

可能な説明はヒストグラムです。 Oracleでは、後の問合せがより多くの行を戻すと推定しています。とにかく 'SKIP SCAN 'はインデックスの使用が可能な最悪のものの一つです。あなたの本当の問題は、インデックスがないことです。 'cdcardno'が先頭の列です。 – ibre5041

0

オプティマイザは、コストに基づいて実行計画を生成します。それは順番に統計に基づいています。 SQL Monitorレポートなどの診断データを提供しない限り、受け取る回答は推測になります。

関連する問題