Хранение больших значений. Таблицы TOAST. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Хранение больших значений. Таблицы TOAST.



Для хранения больших по размеру данных в PostgreSQL используется техника TOAST (The Oversized-Attribute Storage Technique). PostgreSQL использует фиксированный размер страницы (обычно 8 Кб), и не позволяет кортежам занимать несколько страниц. Таким образом, невозможно хранить очень большие значения полей непосредственно в таблице. Чтобы преодолеть это ограничение, большие значения сжимаются и/или разбиваются на несколько физических строк. Этот процесс прозрачен для пользователя.

TOAST поддерживается только для определенных типов данных. Для поддержки TOAST тип данных должен иметь переменную длину (varlena), причем первое 32-разрядное слово содержит общую длину значения в байтах, включая само это слово.

TOAST резервирует два бита varlena-слова: старшие биты для машин с обратным порядок байтов (big-endian) и младшие биты для машин с прямым порядком байтов (little-endian). Тем самым размер любого значения ограничивается 1 Гб (230 - 1 байт). Нулевые значения битов соответствуют обычным (не TOAST) значениям.

Если какой-либо из столбцов таблицы поддерживается TOAST, таблица будет иметь соответствующую TOAST-таблицу, где и будут храниться значения этого столбца. Такие TOAST-значения делятся (после сжатия, если оно используется) на блоки размером не более TOAST_MAX_CHUNK_SIZE байт (по умолчанию это значение выбирается так, чтобы четыре блока помещались на страницу, всего около 2000 байт). Каждый блок хранится в виде отдельной строки в TOAST-таблице. Каждая TOAST-таблица содержит столбцы:

- chunk_id (OID TOAST-значений),

- chunk_seq (порядковый номер блока в пределах своего TOAST-значения),

- chunk_data (фактические данные блока).

Уникальный индекс по chunk_id и chunk_seq обеспечивает быстрый поиск значений. TOAST-указатель, следовательно, должен хранить OID TOAST-таблицы и OID от конкретного TOAST-значения (его chunk_id). Для удобства, TOAST-указатель также хранит размер несжатых данных и реальный размер хранимых данных (если данные были сжаты). Учитывая байт varlena-заголовка, общий размер TOAST-указателя составляет 18 байт независимо от фактического размера представляемого значения.

Механизм TOAST запускается только тогда, когда строка, которая будет храниться в таблице превышает TOAST_TUPLE_THRESHOLD байт (обычно 2 Кб). Значение столбца, для которого поддерживается TOAST, будет сжиматься и/или перемещаться в TOAST-таблицу пока длина строки не станет короче, чем TOAST_TUPLE_TARGET байт (также обычно 2 Кб).

Механизм TOAST использует четыре различные стратегии для хранения данных:

- PLAIN предусматривает либо сжатие, либо хранение вне основной таблицы, кроме того он исключает использование однобайтовых varlena-заголовков (единственная возможная стратегия для столбцов, для которых не поддерживается TOAST).

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

- EXTERNAL позволяет хранение вне основной таблицы, но не сжатие. Использование этой стратегии позволяет ускорить построковые операции в текстовых и байтовых полях (но за счет увеличения пространства для хранения), поскольку эти операции оптимизированы для извлечения необходимых частей данных, когда они не сжаты.

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

Для каждого типа данных, для которого поддерживается TOAST, определена используемая стратегия по умолчанию, но стратегия для данного столбца таблицы можно изменить с помощью команды ALTER TABLE SET STORAGE

Рассмотренная схема имеет ряд преимуществ по сравнению с более простыми подходами, допускающими, например, использование только строк определенного размера, соответствующего размеру страницы файла базы данных. Если предположить, что в запросах, как правило, фигурируют относительно небольшие значения ключа таблицы, большая часть работы будет производиться исполнителем над не TOAST-полями. Последние будут выбираться (если они вовсе указываются в запросе) только при отправке результатов клиенту. Таким образом, основная таблица намного меньше, чем было бы в случае без каких-либо TOAST-значений. Поэтому и сортировка будет чаще выполняться полностью в оперативной памяти. Тестирование показало, что при использовании TOAST таблица, содержащая типичные HTML-страницы и их URL-адреса, занимает примерно половину размера необработанных исходных данных, причем в основной таблице содержится только около 10% всей информации (URL-адреса и несколько небольших HTML страницы). Для такой таблицы времени выполнения оказывается таким же, как и для таблицы без TOAST, в которой все HTML-страниц были сокращены до 7 Кб.



Поделиться:


Последнее изменение этой страницы: 2017-01-25; просмотров: 306; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.247.58 (0.005 с.)