Использование подсказки Oracle «FIRST_ROWS» для повышения производительности базы данных Oracle

У меня есть инструкция, которая выполняется на сервере базы данных 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 занимает 1 секунду, чтобы вернуть 590 записей. Оператор для userid = 2 занимает около 30 секунд, чтобы вернуть 70 записей.

Я не понимаю, почему такая большая разница.

Похоже, что для инструкции с userid = 1 выбран другой план выполнения, а для userid = 2 – другой.

После того, как я реализовал Oracle Hint FIRST_ROW, производительность значительно улучшилась. Оба утверждения (для обоих идентификаторов 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) Есть ли что-то, с чем мне следует быть осторожным, когда я решаю добавить эту подсказку к своим запросам?

Спасибо

8
задан Sebas 23 June 2012 в 03:10
поделиться