Oracle очистить кэш запросов

Обновлено: 07.07.2024

Я хочу узнать реальное время выполнения моего запроса с различными подсказками и без них. Но oracle DB кэширует запрос после его первого выполнения, а во второй раз он выполняется быстро. Как я могу очистить этот кэш после каждого выполнения запроса?

1 ответ

Я пытаюсь сравнить производительность различных запросов Solr. Для того, чтобы получить справедливое испытание, я хочу, чтобы очистить кэш-память между запросами. Как это делается? Конечно, можно перезапустить сервер, мне было любопытно, есть ли более быстрый способ.

Похожие вопросы:

Я хочу знать, как вы можете очистить свой кэш Java, используя код Java или код строки CMD. Это должно быть сделано на машине Microsoft Windows в любом месте от Windows 7 и выше. Это должно быть.

Мне нужно очистить кэш моего doctrine в Symfony 2 . В командной строке должен быть какой-то способ очистить кэш . Или где я должен найти и удалить файлы, принадлежащие кэшу?

Я использую Magento ver1.6.1. Мне нужно очистить кэш Magento программно. Mage::app()->getCache()->clean() Я использовал приведенный выше код, но он не очистил кэш.

Я пытаюсь сравнить производительность различных запросов Solr. Для того, чтобы получить справедливое испытание, я хочу, чтобы очистить кэш-память между запросами. Как это делается? Конечно, можно.

Как очистить (очистить) кэш чтения файлов windows с помощью C++ win32api?

Как я могу поддерживать работу службы WCF между запросами? Служба создает простой кэш в памяти при инициализации, и я не хочу, чтобы службе приходилось повторно инициализироваться между запросами.

Можно ли очистить только кэш базы данных или очистить весь кэш с исключением в Laravel ? Мне нужно кэшировать переменный результат, но он будет удален, когда я запущу Cache::Flush() , чтобы очистить.

Я провожу тестирование на AWS Redshift, и для репликации реальных сценариев мне нужно, чтобы мои тестовые запросы не кэшировались, чтобы не давать ложной картины производительности. Есть ли у меня.

Я читаю эту статью: Need for Speed-Boost Performance in Data Processing with SAS/Access® Interface to Oracle . И я хотел бы знать, как очистить кэш / буфер в SAS, чтобы мой повторный запрос / тест.

первый раз, когда я выполняю запрос, может занять > 15 secs . Последующие выполнения возвращаются в < 1 sec .

как заставить SQL Server 2005 не использовать кэшированные результаты? Я пробовал бежать

но это, похоже, не влияет на скорость запроса (все еще < 1 sec ).

вот некоторые хорошие объяснения. зацени.

из связанной статьи:

Если все тестирование производительности проводится в SQL Server, лучшим подходом может быть выдача контрольной точки, а затем команда DBCC DROPCLEANBUFFERS. Хотя процесс контрольных точек является автоматическим внутренним системным процессом в SQL Server и происходит регулярно, важно, чтобы эту команду писать все "грязные" страницы в текущей базе данных на диск и очистки буферов. Затем можно выполнить команду DBCC DROPCLEANBUFFERS для удаления всех буферов из пула буферов.

хотя вопрос немного устарел, это все равно может помочь. Я сталкиваюсь с подобными проблемами, и использование опции ниже помогло мне. Не уверен, что это постоянное решение, но пока оно исправляет его.

тогда ваш запрос будет выглядеть следующим образом

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

кстати, то, что вызывает ускорение, - это не кэш запросов, а кэш данных.

восемь различных способов очистки кэша плана

1. Удалите все элементы из кэша плана для всего экземпляра

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

3. Очистите специальный и подготовленный кэш плана для всего экземпляра

4. Очистите специальный и подготовленный кэш плана для одного пула ресурсов

5. Очистите весь кэш плана для одного пула ресурсов

6. Удаляет все элементы из кэша планов для одной базы данных (не работает в SQL Azure)

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

8. Удалить один план запроса из кэша

обратите внимание, что ни DBCC DROPCLEANBUFFERS; , ни DBCC FREEPROCCACHE; поддерживается в хранилище данных SQL Azure / SQL.

однако, если вам нужно сбросить кэш плана в SQL Azure, вы можете изменить одну из таблиц в запросе (например, просто добавьте, а затем удалите столбец), это будет иметь побочный эффект удаления плана из кэша.

Я лично делаю это как способ тестирования производительности запросов без необходимости иметь дело с кэшированных планов.

Oracle Result Cache -кэш результатов увеличивает скорость запросов SQL в базах данных Oracle

Улучшать время отклика (скорости исполнения) часто выполняемых SQL-запросов можно за счет использования кэша результатов. Кэш результатов сохраняет результаты SQL-запросов и PL/SQL -функций в новом компоненте SGA под названием Result Cache Memory (Память кэша результатов). При первом выполнении повторяющегося запроса база данных кэширует его результаты, а при последующих выполнениях — просто извлекает эти результаты из кэша результатов вместо того, чтобы выполнять запрос снова. В случае изменения любого из объектов, являющихся частью запроса, база данных делает находящиеся в кэше результаты этого запроса недействительными. Идеальными кандидатами на кэширование результатов являются запросы, которые предусматривают получение доступа к множеству строк для возврата всего лишь нескольких, как часто бывает во многих решениях типа хранилищ данных. Кэш результатов состоит из двух компонентов: SQL Query Result Cache (Кэш результатов SQL-запросов), в котором сохраняются результаты SQL-запросов, и PL/SQL Function Result Cache (Кэш результатов PL/SQL-функций), в котором сохраняются значения, возвращаемые PL/SQL-функциями, причем оба они используют одну и ту же инфраструктуру. О каждом из этих компонентов кэша результатов более подробно рассказывается в этой статье блога.

Настройка кэша результатов

Кэш результатов по умолчанию всегда включен, и его размер зависит от объема памяти, который база данных выделяет под разделяемый пул. В случае задания параметра MEMORY_TARGET для выделения памяти Oracle выделяет под кэш результатов 0,25% от значения этого параметра, а в случае задания параметра SGA_TARGET — 0,5% от его значения.

Выделяемый кэшу результатов объем памяти можно изменять установкой значения для параметра инициализации RESULT_CACHE_MAX_SIZE. Значение этого параметра может варьироваться от нуля до системного максимума. Установка нулевого значения, как показано ниже, приводит к отключению механизма кэширования результатов:

Поскольку по умолчанию механизм кэширования результатов включен, это означает, что и параметр RESULT_CAHCE_MAX_SIZE по умолчанию тоже имеет некое положительное значение, какое именно — зависит от значения параметра MEMORY_TARGET (или SGA_TARGET, если вместо этого используется такой параметр).

Помимо параметра RESULT_CACHE_MAX_SIZE, на функционирование кэша результатов оказывают воздействие еще два параметра: RESULT_CACHE_MAX_RESULT и RESULT_CACHE_REMOTE_EXPIRATION. Параметр RESULT_CACHE_MAX_RESULT указывает, сколько максимум места в кэше результатов может занимать один результат. По умолчанию один кэшируемый результат может занимать вплоть до 5% пространства кэша результатов, но в принципе можно разрешать занимать ему от 1% до 100%. Что касается параметра RESULT_CACHE_REMOTE_EXPIRATION, то он определяет, насколько долго находящийся в кэше результат, который зависит от удаленных объектов, должен оставаться действительным. По умолчанию этот параметр установлен в 0, т.е. использовать кэш результатов для запросов, в которых принимают участие удаленные объекты, нельзя. Объясняется это тем, что со временем удаленные объекты могут изменяться и, следовательно, приводить к превращению хранимых в кэше результатов в недействительные.

Установка значения для параметра RESULT_CACHE_MODE

То, будет база данных кэшировать результат запроса или нет, зависит от значения параметра инициализации RESULT_CACHE_MODE, который может принимать два значения: MANUAL или FORCE. Ниже приведено краткое описание того, как эти два значения воздействует на связанное с кэшированием результатов поведение в базе данных.

  • В случае установки для этого параметра значения FORCE база данных будет пытаться использовать кэш для всех результатов везде, где может. Этап помещения результатов в кэш, однако, в таком случае может пропускаться за счет включения в запрос подсказки NO_RESULT_CACHE.
  • В случае установки для этого параметра значения MANUAL база данных будет помещать результаты запроса в кэш только при условии наличия в запросе подсказки RESULT_CACHE.

По умолчанию для параметра RESULT_CACHE_MODE принимается значение MANUAL, и изменять его динамически можно так, как показано ниже:

Использование подсказок RESULT_CACHE и NO_RESULT_CACHE

Использование подсказки RESULT_CACHE в виде части запроса приводит к добавлению в план выполнения этого запроса операции ResultCache. Эта операция ResultCache будет просматривать кэш результатов для выяснения того, не хранится ли в нем результат для данного запроса. Если таковой в кэше имеется, она будет извлекать его, а если нет, тогда будет выполнять запрос и сохранять его результаты в кэше результатов. Подсказка no_result_cache работает противоположным образом. При добавлении ее в запрос она будет заставлять операцию ResultCache обходить кэш результатов и выполнять запрос заново.

Ниже приведен пример включения в SQL-запрос подсказки RESULT_CACHE:

В этом примере подсказка RESULT_CACHE в первой строке запроса указывает, что должна использоваться операция ResultCache, проверяющая кэш результатов на предмет наличия в нем готовых результатов данного запроса и, если таковых там нет, выполняющая запрос и сохраняющая его результаты в кэше. Вывод EXPLAIN PLAN для этого запроса показывает, что для него используется кэш результатов:

Совет. Подсказки RESULT_CACHE и NO_RESULT_CACHE всегда превосходят по важности значение, установленное для параметра инициализации RESULT_CACHE_MODE.

Вывод EXPLAIN PLAN выявляет использование кэша результатов для запроса в данном примере. Раз для использования кэша результатов пришлось применять подсказку RESULT_CACHE, значит, для параметра RESULT_CACHE_MODE установлено значение MANUAL. В случае установки для него значения FORCE добавлять подсказку RESULT_CACHE в запросы не понадобится. База данных будет просто кэшировать результаты всех повторяющихся SQL- операторов, если только в них не будет присутствовать подсказка NO_RESULT_CACHE.

Oracle Result Cache - кэш результатов ускоряет запросы SQL в базе данных Oracle

Управление кэшем результатов

Для управления кэшем результатов, например, для проверки его состояния или сбрасывания его содержимого, служит пакет DBMS_RESULT_CACHE. Ниже приведен пример проверки объема выделяемой кэшу памяти за счет выполнения такой функции из этого пакета, как MEMORY_REPORT:

С помощью функции STATUS можно проверять текущее состояние кэша результатов, каковое может выглядеть как ENABLED или DISABLED. Очищается кэш результатов посредством процедуры или функции FLUSH. Необходимость в очистке кэша результатов может возникать в случае его полного заполнения базой данных, поскольку автоматически сброс его содержимого не происходит. При загрузке новой версии функции, например, может быть удобно избавиться от результатов старой функции в кэше, удалив их с помощью процедуры или функции FLUSH. Перед выполнением процедуры или функции FLUSH, однако, нужно обязательно перевести кэш результатов в обходной режим, запустив процедуру BYPASS со значением TRUE. После очистки кэша результатов нужно выполнить процедуру BYPASS снова, но на этот раз со значением FALSE, как показано ниже:

Ниже перечислены представления, которые можно использовать для управления кэшем результатов.

  • V$RESULT_CACHE_STATISTICS. Это представление отображает перечень настроек кэша и статистические данные по используемой им памяти.
  • V$RESULT_CACHE_OBJECTS. Это представление отображает список всех находящихся в кэше объектов и их атрибутов.
  • V$RESULT_CACHE_DEPENDENCY. Это представление отображает информацию о зависимостях между находящимися в кэше результатами и объектами, от которых они зависят.
  • V$RESULT_CACHE_MEMORY. Это представление отображает список всех используемых кэшем блоков памяти и статистические данные по ним.
  • V$RESULT_CACHE_OBJECTS. Это представление отображает список как всех находящихся в кэше результатов, так и их зависимостей.

Например, для выяснения того, какие результаты находятся в кэше результатов, можно воспользоваться следующим запросом к представлению V$RESULT_CACHE_OBJECTS:

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

Ограничения по использованию кэша результатов SQL-запросов

Ниже перечислены объекты, для которых нельзя помещать результаты в кэш результатов SQL-запросов (SQL Query Result Cache):

  • временные таблицы;
  • таблицы словаря данных;
  • недетерминированные функции PL/SQL;
  • псевдофункции curval и nextval;
  • функции SYSDATE, SYS_TIMESTAMP, CURRENT_DATE, CURRENT_TIMESTAMP, LOCAL_TIMESTAMP, USERENV, SYS_CONTEXT и SYS_QUID.

Кроме того, в кэш нельзя помещать результаты подзапросов, но для них можно использовать подсказку RESULT_CACHE во вложенном представлении.

Компонент PL/SQL Function Result Cache

Компонент SQL Query Result Cache (Кэш результатов SQL-запросов) разделяет инфраструктуру кэша результатов с компонентом PL/SQL Function Result Cache (Кэш результатов PL/SQL-функций), который кэширует результаты PL/SQL-функций. Кандидатами на помещение в кэш результатов PL/SQL-функций являются те функции, которые используются в базе данных часто и зависят от относительно статической информации. При желании можно указать, что база данных должна делать находящиеся в кэше результаты PL/SQL-функции недействительными в случае внесения изменений в любой из объектов, от которых эта функция зависит.

Создание кэшируемой функции

Заставить базу данных помещать результаты функции в кэш PL/SQL Function Result Cache можно, включив в определение PL/SQL-функции конструкцию RESULT_CACHE, например, так:

Конструкция RELIES_ON является необязательной. Она указывает, что база данных должна делать результаты функции в кэше недействительными в случае подвергания любой из таблиц или других объектов, от которых эта функции зависит, какому-нибудь изменению. При первом выполнении функции GET_DEPT_INFO базой данных она будет выполняться обычным образом. При последующих же выполнениях этой функции база данных будет извлекать ее значения прямо из кэша PL/SQL Result Function Cache вместо того, чтобы выполнять ее заново. Выполнять функции заново база данных будет только в следующих случаях.

  • В случае обхода кэша результатов за счет не указания подсказки RESULT_CACHE.
  • В случае выполнения процедуры DBMS_RESULT_CACHE_BYPASS для вынуждения функций и запросов обходить кэш результатов, независимо от значения параметра RESULT_CACHE_MODE или указания подсказки RESULT_CACHE.
  • В случае изменения любого из лежащих в основе функции объектов и указания конструкции RELIES_ON в ее определении.
  • В случае удаления находящихся в кэше результатов базой данных из-за того, что система нуждается в дополнительной памяти.

Ограничения

Для того чтобы база данных помещала результаты PL/SQL-функции в кэш, эта функция должна удовлетворять следующим требованиям:

  • не содержать никаких параметров IN/OUT;
  • не представлять собой анонимный блок;
  • не определяться в модуле, который обладает правами вызывающего (invoker rights);
  • не содержать параметров типа коллекций, объектного типа, типа REF CURSOR или LOB;
  • не представлять собой конвейерную табличную функцию.

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

Компонент Client Query Result Cache

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

Включение и отключение компонента Client Query Result Cache

Как и для механизма кэширования на стороне сервера, для включения и отключения механизма кэширования на стороне клиентов применяется параметр инициализации RESULT_CACHE_MODE. Подсказки RESULT_CACHE и NO_RESULT_CACHE тоже работают тем же самым образом, что и при выполнении кэширования на стороне сервера. В случае указания значения MANUAL для параметра RESULT_CACHE_MODE, для того, чтобы результаты запроса кэшировались, нужно обязательно включить в него подсказку RESULT_CACHE. Кроме того, как и в случае кэширования на стороне сервера, обе эти подсказки переопределяют значение параметра RESULT_CACHE_MODE. Передавать подсказки RESULT_CACHE и NO_RESULT_CACHE операторам SQL, правда, нужно с помощью вызовов OCIStatementPrepare() и OCIStatementPrepare2().

Управление компонентом Client Query Result Cache

Управлять тем, как работает компонент Client Query Result Cache, позволяют два параметра. Ниже приведено их краткое описание.

  • CLIENT_RESULT_CACHE_SIZE. Этот параметр позволяет задавать максимальный размер клиентского кэша наборов результатов для каждого процесса (в байтах). Установка для него нулевого значения приводит к отключению Client Query Result Cache. По умолчанию база данных выделяет каждому клиентскому процессу OCI максимальный объем памяти.

Совет. Значение параметра CLIENT_RESULT_CACHE_SIZE можно переопределять с помощью серверного параметра OCI_RESULT_CACHE_MAX_SIZE. Например, установкой для него нулевого значения можно полностью отключить компонент Client Query Result Cache.

  • CLIENT_RESULT_CACHE_LAG. Этот параметр позволяет задавать для Client Query Result Cache время запаздывания (lag time). Установка для него низкого значения ведет к увеличению количества круговых обращений из библиотеки клиента OCI к базе данных. Поэтому задавать для него низкое значение стоит только в том случае, если приложение получает доступ к базе данных нечасто.

Еще есть необязательный клиентский конфигурационный файл, который переопределяет любые из касающихся кэширования на стороне клиента параметров, которые устанавливаются на сервере. Называется он sqlnet.ora, и в нем можно устанавливать следующие конфигурационные параметры на стороне клиента.

  • OCI_RESULT_CACHE_MAX_SIZE. Этот параметр позволяет указывать максимальный размер кэша запросов для одного процесса.
  • OCI_RESULT_CACHE_MAX_RSET_SIZE. Этот параметр позволяет задавать максимальный размер одного результата в байтах для одного процесса.
  • OCI_RESULT_CACHE_MAX_RST_ROWS. Этот параметр позволяет указывать максимальный размер результата запроса в строках для одного процесса.

Также в приложениях OCI можно применять подсказки RESULT_CACHE и NO_RESULT_CACHE. С помощью представления CLIENT_RESULT_CACHE можно просматривать параметры кэша результатов и статистику использования Client Query Result Cache.

Ограничения

Ниже перечислены запросы, результаты которых нельзя помещать в кэш на стороне клиенте, хотя их возможно помещать в кэш результатов на стороне сервера:

On oracle 10gr2, I have several sql queries that I am comparing performance. But after their first run, the v$sql table has the execution plan stored for caching, so for one of the queries I go from 28 seconds on first run to .5 seconds after.

ALTER SYSTEM FLUSH BUFFER_CACHE;

After running this, the query consistently runs at 5 seconds, which I do not believe is accurate.

Thought maybe deleting the line item itself from the cache:

delete from v$sql where sql_text like 'select * from.

but I get an error about not being able to delete from view.


10.3k 15 15 gold badges 73 73 silver badges 92 92 bronze badges

3 Answers 3

Peter gave you the answer to the question you asked.

That is the statement you would use to "delete prepared statements from the cache".

(Prepared statements aren't the only objects flushed from the shared pool, the statement does more than that.)

As I indicated in my earlier comment (on your question), v$sql is not a table. It's a dynamic performance view, a convenient table-like representation of Oracle's internal memory structures. You only have SELECT privilege on the dynamic performance views, you can't delete rows from them.

flush the shared pool and buffer cache?

The following doesn't answer your question directly. Instead, it answers a fundamentally different (and maybe more important) question:

Should we normally flush the shared pool and/or the buffer cache to measure the performance of a query?

In short, the answer is no.

I think Tom Kyte addresses this pretty well:

<excerpt>

Actually, it is important that a tuning tool not do that. It is important to run the test, ignore the results, and then run it two or three times and average out those results. In the real world, the buffer cache will never be devoid of results. Never. When you tune, your goal is to reduce the logical I/O (LIO), because then the physical I/O (PIO) will take care of itself.

Consider this: Flushing the shared pool and buffer cache is even more artificial than not flushing them. Most people seem skeptical of this, I suspect, because it flies in the face of conventional wisdom. I'll show you how to do this, but not so you can use it for testing. Rather, I'll use it to demonstrate why it is an exercise in futility and totally artificial (and therefore leads to wrong assumptions). I've just started my PC, and I've run this query against a big table. I "flush" the buffer cache and run it again:

</excerpt>

I think Tom Kyte is exactly right. In terms of addressing the performance issue, I don't think that "clearing the oracle execution plan cache" is normally a step for reliable benchmarking.

Let's address the concern about performance.

You tell us that you've observed that the first execution of a query takes significantly longer (

28 seconds) compared to subsequent executions (

5 seconds), even when flushing (all of the index and data blocks from) the buffer cache.

To me, that suggests that the hard parse is doing some heavy lifting. It's either a lot of work, or its encountering a lot of waits. This can be investigated and tuned.

I'm wondering if perhaps statistics are non-existent, and the optimizer is spending a lot of time gathering statistics before it prepares a query plan. That's one of the first things I would check, that statistics are collected on all of the referenced tables, indexes and indexed columns.

If your query joins a large number of tables, the CBO may be considering a huge number of permutations for join order.

A discussion of Oracle tracing is beyond the scope of this answer, but it's the next step.

I'm thinking you are probably going to want to trace events 10053 and 10046.

Here's a link to an "event 10053" discussion by Tom Kyte you may find useful:

A few years back, I did see one query that had elapsed times in terms of MINUTES on first execution, subsequent executions in terms of seconds. What we found was that vast majority of the time for the first execution time was spent on the hard parse.

This problem query was written by a CrystalReports developer who innocently (naively?) joined two humongous reporting views.

One of the views was a join of 62 tables, the other view was a join of 42 tables.

The query used Cost Based Optimizer. Tracing revealed that it wasn't wait time, it was all CPU time spent evaluating possible join paths.

Each of the vendor supplied "reporting" views wasn't too bad by itself, but when two of them were joined, it was agonizingly slow. I believe the problem was the vast number of join permutations that the optimizer was considering. There is an instance parameter that limits the number of permutations considered by the optimizer, but our fix was to re-write the query. The improved query only joined the dozen or so tables that were actually needed by the query.

(The initial immediate short-term "band aid" fix was to schedule a run of the query earlier in the morning, before report generation task ran. That made the report generation "faster", because the report generation run made use of the already prepared statement in the shared pool, avoiding the hard parse.

The band aid fix wasn't a real solution, it just moved the problem to a preliminary execution of the query, when the long execution time wasn't noticed.

Our next step would have probably been to implement a "stored outline" for the query, to get a stable query plan.

Of course, statement reuse (avoiding the hard parse, using bind variables) is the normative pattern in Oracle. It mproves performance, scalability, yada, yada, yada.

This anecdotal incident may be entirely different than the problem you are observing.

Читайте также: