Oracle データベース サーバーで実行するステートメントがあります。ステートメントには約 5 つの結合があり、異常はありません。以下のように見えます。
SELECT field1, field2, field3, ...
FROM table1, table2, table3, table4, table5
WHERE table1.id = table2.id AND table2.id = table3.id AND ...
table5.userid = 1
問題 (そして興味深い点) は、userid = 1 のステートメントが 590 レコードを返すのに 1 秒かかることです。userid = 2 のステートメントは、70 レコードを返すのに約 30 秒かかります。
なぜこんなに差が大きいのか理解できません。
userid = 1 の文と userid = 2 の文では異なる実行計画が選択されているようです。
Oracle Hint FIRST_ROW を実装した後、パフォーマンスが大幅に向上しました。両方のステートメント (ID 1 と 2 の両方) は、1 秒未満でリターンを生成します。
SELECT /*+ FIRST_ROWS */
field1, field2, field3, ...
FROM table1, table2, table3, table4, table5
WHERE table1.id = table2.id AND table2.id = table3.id AND ...
table5.userid = 1
質問:
- userid = 2 (ヒントが使用されていない場合) の場合にパフォーマンスが低下する理由として考えられるものは何ですか?
- あるステートメントと別のステートメントで実行計画が異なるのはなぜですか (ヒントが使用されていない場合)。
- このヒントをクエリに追加する際に注意すべきことはありますか?