9

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

質問:

  1. userid = 2 (ヒントが使用されていない場合) の場合にパフォーマンスが低下する理由として考えられるものは何ですか?
  2. あるステートメントと別のステートメントで実行計画が異なるのはなぜですか (ヒントが使用されていない場合)。
  3. このヒントをクエリに追加する際に注意すべきことはありますか?
4

1 に答える 1