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
- Подстановка значения из кэша вместо выполнения функции.
- Может применять только для детерминированных функций.
- При создании функции указывается:
- Ключевое слово RESULT_CACHE
- Фраза RELIES_ON — перечень таблиц от которых зависит результат функции
- При изменении таблиц указанных в 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
Последние комментарии