Должно ли создание индекса мгновенно обновлять план запросов Oracle? - PullRequest
2 голосов
/ 22 июля 2010

Если у вас неэффективный запрос и вы добавляете индекс, чтобы повысить производительность, должен ли запрос «мгновенно» начать использовать индекс?

Или вам нужно очистить «кеш» Oracle (я полагаю, v $ sql), запустив alter system flush shared_pool;?

Ответы [ 3 ]

4 голосов
/ 22 июля 2010

Поскольку администратор БД любит отвечать, «это зависит».

Это зависит от того, считает ли Oracle, что индекс поможет производительности. Если Oracle считает, что индекс не лучший выбор для запроса, Oracle все равно его не использует.

Это зависит от того, используете ли вы подготовленные заявления. Готовый оператор не анализируется в течение его срока службы, поэтому, если запущенное приложение использует подготовленный оператор, который вы пытаетесь исправить, вам потребуется перезапустить приложение.

Очистка общего пула вынудит Oracle повторно проанализировать и повторно оптимизировать все операторы (жесткий анализ), поэтому, если Oracle считает, что индекс будет способствовать повышению производительности, очистка общего пула сделает свое дело. Однако это может также иметь далеко идущие последствия в живой производственной системе - вызывать «шторм разбора», поскольку каждое используемое утверждение должно быть обработано и повторно оптимизировано - и должно выполняться только в качестве крайней меры.

3 голосов
/ 22 июля 2010

Вы должны собирать статистику по таблице. Вы можете вычислить или оценить статистику. Пример использования

Compute

BEGIN
  SYS.DBMS_STATS.GATHER_TABLE_STATS (
      OwnName        => 'ENROLLMENT'
     ,TabName        => 'STUDENTS'
    ,Estimate_Percent  => 0
    ,Degree            => 4
    ,Cascade           => TRUE
    ,No_Invalidate     => FALSE);
END;
/

Обратите внимание, что аргумент cascade говорит оракулу также собирать статистику по любым индексам таблицы.

Расчетный

BEGIN
  SYS.DBMS_STATS.GATHER_TABLE_STATS (
      OwnName        => 'ENROLLMENT'
     ,TabName        => 'STUDENTS'
    ,Estimate_Percent  => DBMS_STATS.AUTO_SAMPLE_SIZE
    ,Degree            => 4
    ,Cascade           => TRUE
    ,No_Invalidate     => FALSE);
END;
/

GATHER_TABLE_STATS документы

0 голосов
/ 22 июля 2010

Общий пул не используется для кэширования данных.

Oracle Server имеет два показателя производительности: логическое чтение и физическое чтение.Физическое чтение - это измерение производительности чтения с диска.Логическое чтение - это измерение прочитанных данных из памяти.

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

Логическое чтение - это возвращаемый результат из кэша при попадании, если вы используете индекс для повышения производительности SQL, это улучшение логического чтения.

Короче говоря, в этом нет необходимости.

...