У меня есть инструкция, которая выполняется на сервере базы данных 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) Есть ли что-то, с чем мне следует быть осторожным, когда я решаю добавить эту подсказку к своим запросам?
Спасибо