Классика баз данных - статьи

Кэши записей и объектов


С годами размер страниц в системах баз данных увеличивался, хотя и не так быстро, как скорость передачи данных на диски. С другой стороны, при использовании небольших страниц требуется меньше памяти в буферном пуле для каждого поиска от корня к листьям B-деревьев. Например, рассмотрим индекс с 20 миллионами элементов. При использовании индексных страниц размеров в 128 килобайт, содержащих по 4500 записей, при поиске от корня к листьям требуется два узла и, следовательно, 256 килобайт в буферном пуле, хотя половина этой памяти (корневой узел), вероятно, будет использоваться совместно с другими транзакциями. При использовании индексных страниц размером в 8 килобайт, содержащих по 280 записей, при поиске от корня к листьям требуется три узла, или 24 килобайта в буферном пуле, т.е. на порядок меньше.

В традиционной архитектуре систем баз данных размер страницы, используемый по умолчанию, является компромиссом между эффективным индексным поиском (за счет крупных индексных страниц, как обсуждалось ранее в этой статье и в первоначальных статьях о B-деревьях []) и умеренными требованиями к объему буферного пула при каждом индексном поиске. Тем не менее, в приведенном примере требуется 24 килобайта в буферном пуле для нахождения записи, состоящей, возможно, всего из 20 байт, а также 8 килобайт в буферном пуле для удержания этих 20 байт в основной памяти. При альтернативной организации используются крупные страницы на диске и кэш записей, работающий на приложения; кэш записей позволяет минимизировать потребности в памяти, обеспечивая, тем не менее, удержание требуемых данных. Системы баз данных с хранением данных в основной памяти, используемые в качестве внешних систем традиционных систем баз данных с хранением данных на дисках, можно считать некоторой разновидностью кэша записей.

Внедрение флэш-памяти с ее быстрым временем доступа и небольшим оптимальным размером страниц может привести к отказу от кэшей записей. При использовании крупных дисковых страниц и только небольших страниц в буферном пуле основной памяти желаемый компромисс можно достичь без потребности в двух отдельных структурах данных (т.е. B-дерева и отдельного кэша записей).

В объектно-ориентированных приложениях, которые собирают сложные объекты из многих таблиц и индексов, хранимых в реляционной базе данных, эта проблема может упроститься или усложниться в зависимости от технологии поддержки B-деревьев. Если в традиционных индексах применяется отдельное B-дерево для каждого формата записи, то для сборки сложного объекта в основной памяти требуется много поисков от корня к листьям и, следовательно, много узлов B-деревьев в буферном пуле. Если же записи из нескольких индексов можно перемежать внутри одного B-дерева на основе их общих ключей поиска и порядка сортировки [, ] (например, объектного идентификатора и уместных дополнительных ключей), то может оказаться достаточно выполнить всего несколько, а то и один поиск по B-дереву. Более того, весь сложный объект можно удержать в одной странице буферного пула.



Содержание раздела