Как Oracle решает, какие блоки отсутствуют в буферном кэше для запроса?

0

Вопрос

Предположим, что мы выполнили следующий запрос.

select * from employees where salary > 10000;

Через некоторое время мы выполнили следующий запрос.

select * from employees where salary > 500;

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

Мой вопрос в том, как база данных находит и решает, какие блоки дополнительно считывать с диска?

1

Лучший ответ

3

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

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

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

Каждый блок имеет DBA - адрес блока данных, который состоит из файла# и блока#. Это однозначно идентифицирует блок в базе данных. Oracle использует этот "ключ" для идентификации блока в буферном кэше.

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

Надеюсь, это прояснит ситуацию.

2021-10-28 11:08:38

@oramas, есть сомнения по поводу ответа ?
Roberto Hernandez

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................