Oracle для профессионалов



              

Как ускорить работу? - часть 2


Теперь на уровне синтаксиса все работает, но переписывание может отрицательно сказаться на производительности приложения. Например, обратите внимание, что в рассмотренном ранее коде условие 1=0 (всегда ложное) переписано как :"SYS_B_1" = :"SYS_B_2". Теперь на этапе анализа у оптимизатора нет полной информации чтобы определить, вернет ли этот запрос ноль строк (еще до его выполнения). Я понимаю, что запросов с конструкциями типа 1=0 у вас немного, но подозреваю, что в некоторых запросах литералы используются умышленно. В таблице может быть столбец с весьма неравномерным распределением значений (например, 90 процентов значений в столбце — больше 100, а 10 процентов — меньше 100). Причем лишь 1 процент значений меньше 50. Хотелось бы, чтобы при выполнении запроса:

select * from t where x < 50;

индекс использовался, а при выполнении запроса:

select * from t where x > 100;

не использовался. Если установить параметр CURSOR_SHARING = FORCE, оптимизатор не сможет учесть значения 50 или 100, поэтому будет выбирать план для общего случая, когда индекс скорее всего не будет использоваться (даже если 99,9 процентов запросов будут содержать конструкцию WHERE x < 50).

Кроме того, я обнаружил, что, хотя установка CURSOR_SHARING = FORCE

обеспечивает намного большую скорость работы, чем повторный анализ и оптимизация множества одинаковых запросов как уникальных, это все равно медленнее, чем выполнение запросов, где связываемые переменные используются изначально. Это происходит не из-за неэффективности механизма совместного использования кода курсора, а из-за неэффективности самой программы. В главе 10 мы рассмотрим, как анализ операторов SQL может влиять на производительность в целом. Во многих случаях приложение, не использующее связываемые переменные, также не обеспечивает эффективного анализа и повторного использования курсоров. Поскольку в приложении предполагается уникальность каждого запроса (так как для каждого из них создается уникальный оператор), то и курсор в нем не будет использоваться более одного раза. Факт в том, что если программист использует связываемые переменные, то он зачастую также анализирует курсор один раз и затем использует многократно. Именно затраты ресурсов на повторный анализ приводят к наблюдаемому снижению производительности.




Содержание  Назад  Вперед