По мотивам статьи Troubleshooting Bad Execution Plans
Плохой запрос -- плохой (неправильный с нашей точки зрения) план. Причины плохого плана:
Как же его отремонтировать? Очень понравилось, почему не стоит ремонтировать запросы через глобальные параметры:
PS: если нужно поставить параметр для отдельно взятого запроса, можно использовать хинт /*+ opt_param('optimizer_index_cost_adj', 100) */
Плохой запрос -- плохой (неправильный с нашей точки зрения) план. Причины плохого плана:
- Неправильная статистика
- Переустановленные параметры оптимизатора (optimizer_index_..., db_file_multiblock_read_count)
Как же его отремонтировать? Очень понравилось, почему не стоит ремонтировать запросы через глобальные параметры:
Что же делать? Ответ традиционен -- корректировать статистику. Причины, по которой статистика может быть неадекватной (кроме очевидной, что ее собирают неправильно или совсем не собирают):
- This is a global change to a local problem
- Although it appears to solve one problem, it is unknown how many bad execution plans resulted from this change
- The root cause of why the index plan was not chosen is unknown, just that tweaking parameters gave the desired result
- Using non-default parameters makes it almost impossible to correctly and effectively troubleshoot the root cause
Советы по исправлению ошибок можно прочитать в самой статье.
- Data skew: Is the NDV inaccurate due to data skew and a poor dbms_stats sample?
- Data correlation: Are two or more predicates related to each other?
- Out-of-range values: Is the predicate within the range of known values?
- Use of functions in predicates: Is the 5% cardinality guess for functions accurate?
- Stats gathering strategies: Is your stats gathering strategy yielding representative stats?
PS: если нужно поставить параметр для отдельно взятого запроса, можно использовать хинт /*+ opt_param('optimizer_index_cost_adj', 100) */