2016-10-11 8 views
1

Мы анализируем SQL-запросы в базе данных Oracle 12c. Мы заметили, что следующее утверждение улучшилось, выполнив несколько раз. Как можно объяснить, что он улучшается, выполняя его второй и третий раз?Oracle SQL-запрос повышает производительность при втором и третьем выполнении

SELECT COUNT (*) 
    FROM asset 
WHERE  ( ( (status NOT IN ('x1', 'x2', 'x3')) 
       AND ((siteid = 'xxx'))) 
      AND (EXISTS 
        (SELECT siteid 
         FROM siteauth a, groupuser b 
         WHERE  a.groupname = b.groupname 
          AND b.userid = 'xxx' 
          AND a.siteid = asset.siteid))) 
     AND ((assetnum LIKE '5%')); 
  • Первый запуск: 24 сек.
  • Второй запуск: 17 сек.
  • Третий проход: 7 сек.
  • Четвертый пробег: 7 сек.
  • Настроено с использованием результата наличными: 0,003 Sec.
+2

Вы сбрасывали shared_pool и buffer_cache перед запуском второго, третьего и так далее? Oracle кэширует результаты запросов. – Kacper

+1

Адаптивная оптимизация запросов: http://www.oracle.com/technetwork/database/database-technologies/query-optimization/overview/index.html –

ответ

4

Oracle не кэширует результаты запросов по умолчанию, а кэширует блоки данных, используемые запросом. Также 12c имеет такие функции, как «Адаптивные планы выполнения» и «Обратная связь с кардиналом», которые могут привести к изменениям плана выполнения между казнями, даже если статистика таблицы не была пересчитана.

1

Oracle извлекает данные с диска в память. Во второй раз, когда вы запускаете запрос, данные находятся в памяти, поэтому чтение диска не требуется. Результатом является более быстрое выполнение запросов. База данных «разогрета».

+0

Как можно объяснить улучшение в третьем исполнении? – r0tt