Главная > SQL > Result Cache


Result Cache

SQL Query Result Cache

Возможности Query Result Cache

  • Позволяет кэшировать результаты запросов, подзапросов.
  • Кэш совместно используется SQL операторами и сессиями пользователей.
  • Значительное ускорение операций чтения
  • Кэш обновляется при изменении таблиц, из которых получен кэшируемый результат
  • Result Cache для параметризованного запроса может переиспользоваться если запрос выполняется с теми же параметрами
  • Добавление RESULT_CACHE во вложенные представления отключает оптимизацию между внешним и вложенным представлением в целях максимального повторного использования результата из кэша

Кэширование отключено в случае

  • Временные или dictionary-таблицы
  • Недетерминированные PL/SQL функции
  • Использование CURRVAL и NEXTVAL
  • Недетерминированные SQL функции: sysdate, current_date и др.
  • Запрос основанный на согласованном чтение данных, которые старше чем последняя сохраненная версия, не будет кешироваться


Для явного указания, что запрос необходимо кэшировать используем хинт result_cache.

select /*+ RESULT_CACHE */
       p.prod_category,
       sum(s.amount_sold) revenue
  from products p, sales s
 where s.prod_id = p.prod_id
       and s.time_id between to_date('01-JAN-2006', 'dd-MON-yyyy')
                             to_date('31-DEC-2006', 'dd-MON-yyyy')
 group by rollup(p.prod_category);

------------------------------------------------------------------
| Id  | Operation                   | Name                       |
------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                            |
|   1 |  RESULT CACHE               | fz6cm4jbpcwh48wcyk60m7qypu |
|   2 |   SORT GROUP BY ROLLUP      |                            |
|*  3 |    HASH JOIN                |                            |
|   4 |     PARTITION RANGE ITERATOR|                            |
|*  5 |      TABLE ACCESS FULL      | SALES                      |
|   6 |     VIEW                    | index$_join$_001           |
|*  7 |      HASH JOIN              |                            |
|   8 |       INDEX FAST FULL SCAN  | PRODUCTS_PK                |
|   9 |       INDEX FAST FULL SCAN  | PRODUCTS_PROD_CAT_IX       |
------------------------------------------------------------------


PL/SQL Result Cache

  • Подстановка значения из кэша вместо выполнения функции.
  • Может применять только для детерминированных функций.

    При создании функции указывается:

  1. Ключевое слово RESULT_CACHE
  2. Фраза RELIES_ON — перечень таблиц от которых зависит результат функции
  3. При изменении таблиц указанных в RELIES_ON кэш для функции очищается.

create function getamount(paccountid in number, pcurrency in varchar2) return number
 result_cache relies_on(accounts, accounts_amounts);
is
begin
 ...
 return xres;
end;

Фраза RELIES_ON может быть опущена.

При этом задача поддержки актуальности кэша возлашается на программиста. Разработчик сам определяет события по которым необходимо чистить кэш. Для этого используется пакет DBMS_RESULT_CACHE и его метод INVALIDATE.

begin
...
  if ... then
     DBMS_RESULT_CACHE.INVALIDATE(USER,'NAME_FUNCTION');
  end if;
..
end;


SQL & PL/SQL Result Cache

Result Cache располагается в разделяемом пуле (разделяется всеми сессиями)

Параметры инициализации Описание
RESULT_CACHE_MAX_SIZE задает макс. размер кэша в SGA. Если установить 0, кэш будет полностью выключен
RESULT_CACHE_MAX_RESULT макс. % от кэша для одного объекта
RESULT_CACHE_REMOTE_EXPIRATION кэширование объектов по db-link (через сколько секунд проверять актуальность)
RESULT_CACHE_MODE FORCE — кэшировать все запросы
MANUAL — кэшировать только запросы с hints
AUTO — решение принимает оптимизатор


Results Cache Metadata

Представление Описание
V$RESULT_CACHE_STATISTICS Показывает различные настройки, особенно использование памяти
V$RESULT_CACHE_OBJECTS Показывает объекты, которые составляют кэш результатов SQL
V$RESULT_CACHE_DEPENDENCY Показывает зависимости между различными объектами, составляющими кэш результатов SQL
V$RESULT_CACHE_MEMORY Показывает различные участки памяти, которые составляют кэш результатов SQL


Пакет DBMS_RESULT_CACHE

  • INVALIDATE — очистка кэша для функции
  • FLUSH — очистка всего кэша
  • BYPASS — включение/выключение кэша на уровне экземпляра
  • STATUS — проверка статуса кэша
  • MEMORY_REPORT — вывод отчета об использовании кэша

Пример отчёта DBMS_RESULT_CACHE.MEMORY_REPORT

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as XX

SQL> set serveroutput on;
SQL> EXEC DBMS_RESULT_CACHE.memory_report(detailed => true);

R e s u l t   C a c h e   M e m o r y   R e p o r t
[Parameters]
Block Size          = 1K bytes
Maximum Cache Size  = 4M bytes (4K blocks)
Maximum Result Size = 204K bytes (204 blocks)
[Memory]
Total Memory = 404576 bytes [0.064% of the Shared Pool]

... Fixed Memory = 10696 bytes [0.002% of the Shared Pool]
....... Memory Mgr = 200 bytes
....... Bloom Fltr = 2K bytes
....... Cache Mgr  = 5552 bytes

....... State Objs = 2896 bytes
... Dynamic Memory = 393880 bytes [0.063% of the Shared Pool]
....... Overhead = 131736 bytes
........... Hash Table    = 64K bytes (4K buckets)
........... Chunk Ptrs    = 24K bytes (3K slots)
........... Chunk Maps    = 12K bytes
........... Miscellaneous = 29336 bytes
....... Cache Memory = 256K bytes (256 blocks)
........... Unused Memory = 29 blocks
........... Used Memory = 227 blocks
............... Dependencies = 23 blocks (23 count)
............... Results = 204 blocks
................... Invalid = 204 blocks (1 count)

PL/SQL procedure successfully completed

Похожие записи:

Categories: SQL Tags: ,
  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.