SELECT COUNT(1)
FROM registration r,
proxy p
WHERE r.participant_code = p.participant_code
AND r.proxy_type = p.proxy_type
AND r.proxy_value = p.proxy_value
AND r.proxy_sequence= p.proxy_sequence
で使用されるすべての4つのフィールドがテーブルの結合条件を「プロキシ」 'プロキシのプライマリキーです。クエリの実行計画はプライマリキーを使用してスキャンを行っていますが、一瞬して突然フルテーブルスキャンでインデックススキャンを変更しました。
そのクエリが変更された後に少し( 'r.proxy_value = p.proxy_value' およびスワップ 'r.proxy_type = p.proxy_type' を接合する):
SELECT COUNT(1)
FROM registration r,
proxy p
WHERE r.participant_code = p.participant_code
AND r.proxy_value = p.proxy_value
AND r.proxy_type = p.proxy_type
AND r.proxy_sequence= p.proxy_sequence
実際両方のクエリは同等です。ただし、この変更後、2回目のクエリの実行計画では、フルスキャンではなくインデックススキャンが使用されます。
今、私は非常に具体的な質問があります。
Oracleは2番目のクエリを再コンパイルし、それが実行計画の変更を照会するためにつながりますか?
2つのクエリは、WHERE句内の条件の順序を除いて、等価/同等です。直感的には同じだと思うかもしれませんが、私はそれらを同一にして再テストします(はい、私はこの継ぎ目が非常にアマチュアのようなコメントになることに同意しますが、私は人生で何度も驚いていましたこの種のもの)。 – FDavidov
実際に私はこのシナリオをテストしたことを知っています(はい、動作が変更されました。また、Oracleの実行計画管理メカニズムを制御できないため、再テストするのは非常に難しいことに注意してください)。オラクルはこの状況を処理します。 Oracleのマニュアルに関するすべてのご意見をお待ちしております。 – mvb13
私はあなたを得るか分からない。どちらも同じものを選択するようにしましたか( 'WHERE'節の条件の順序を変更することによって)?はいの場合、あなたはそれらのために異なる実行計画を観察しましたか? – FDavidov