次の2つの非常によく似た文がサブクエリにあります。 **との違いを強調しました。これらのクエリを推論できないOracleは同じです - 非常に異なる実行計画が生成されました
1:
SELECT DISTINCT name
FROM person, nameindex n
WHERE person.id1 ='0812'
AND person.id2 =n.id2
AND person.id1 =n.id1
AND n.phonetic IN
(SELECT n2.phonetic
FROM nameindex n2
WHERE n2.id1=person.id1 **
GROUP BY n2.phonetic
HAVING COUNT(*) BETWEEN 4 AND 500)
2:
SELECT DISTINCT name
FROM person, nameindex n
WHERE person.id1 ='0812'
AND person.id2 =n.id2
AND person.id1 =n.id1
AND n.phonetic IN
(SELECT n2.phonetic
FROM nameindex n2
WHERE n2.id1='0812' **
GROUP BY n2.phonetic
HAVING COUNT(*) BETWEEN 4 AND 500)
私はperson.id1
は、サブクエリで0812
一定でなければならないことを、Oracleが推測できると思います。ただし、両方のクエリでは、実行計画とコストが大きく異なります(1:4404211855、2:cost:36237)。どうしてこれなの?
これはOLTPではなく解析的なクエリであるため、この特定のクエリに対してインデックスは定義されていません。
(クエリの背景:= 4と500の出現の間にであるためnameindexテーブル内の表音エントリが「0812」をID1内の人物の名前を取得します。)私は似たを実行した
両方のバージョンでWHEREが見つかりません。 –
SQL Serverでは、クエリの両方のバージョンで、 '0812'の述語が 'n2'にプッシュダウンされ、計画が同一であるので、Oracle *がこれを推測できますが、あなたの質問から推測できません。 –
Person.id1とnameindex.id1のタイプを教えてください。数字? varchars? –