Параметр HOLDMEM и дополнительные кэши дисковых блоков

Внимание!
В релизе QHB 1.5.1 эта функциональность является экспериментальной, её использование в установке на производственной среде не рекомендовано.

В QHB для ускорения работы с таблицами имеется возможность создавать их особым параметром HOLDMEM, который указывает, где они будут размещаться. Этот параметр может иметь три значения: OFF, POSSIBLY и ONLY.

Синтаксис:

CREATE TABLE cats (id int) WITH (HOLDMEM = OFF);
-- то же самое, что и CREATE TABLE cats (id int);
CREATE TABLE dogs (id int) WITH (HOLDMEM = POSSIBLY);
CREATE UNLOGGED TABLE cows (id int) WITH (HOLDMEM = ONLY);

Примечание
Обратите внимание, что таблицы с HOLDMEM = ONLY должны быть созданы с параметром UNLOGGED.

Значения HOLDMEM

  • OFF — это обычные таблицы. При создании таблицы этот параметр можно опустить. Обычно он нужен, когда требуется изменить свойство таблицы.

    ALTER TABLE dogs SET (HOLDMEM = OFF);
    
  • POSSIBLY — это таблицы, которые по возможности находятся в памяти.

    ALTER TABLE dogs SET (HOLDMEM = POSSIBLY);
    
  • ONLY — это таблицы, которые всегда находятся в памяти.

    ALTER TABLE dogs SET (HOLDMEM = ONLY);
    

Примечание
Все таблицы с параметром HOLDMEM = ONLY должны быть UNLOGGED.
Отдельным запросом сделайте таблицу UNLOGGED:

ALTER TABLE dogs set UNLOGGED;

а затем

ALTER TABLE dogs SET (HOLDMEM = ONLY);

HOLDMEM = POSSIBLY

Таблицы, созданные с параметром HOLDMEM = POSSIBLY, предназначены для хранения данных, к которым требуется быстрый доступ. Для них используется отдельный кэш LRU, за счет простоты которого достигается быстродействие при обращении к нему во время поиска страницы. Однако алгоритм LRU имеет меньше возможностей настройки, чем TARQ, поэтому его использование нужно в особых случаях, например, при работе с данными, к которым требуется частое обращение.

Примечание
Все таблицы с параметром HOLDMEM = ONLY должны быть UNLOGGED.
Отдельным запросом сделайте таблицу UNLOGGED:
ALTER TABLE dogs set UNLOGGED;
а затем
ALTER TABLE dogs SET (HOLDMEM = ONLY);

HOLDMEM = ONLY

Таблицы, созданные с параметром HOLDMEM = ONLY, предназначены для хранения данных, к которым требуется максимально быстрый доступ.

Однако нужно знать некоторые особенности при работе с ним:

  • Так как все данные хранятся в памяти, переполнение этого буфера приведет к ошибке. Также при сбое или экстренном завершении данные не могут быть и не будут восстановлены.

  • Не поддерживается механизм TOAST.

    а) При создании таблицы всем столбцам будет принудительно установлен режим хранения PLAIN.

    б) У существующей таблицы нельзя изменить атрибут хранения на HOLDMEM = ONLY, если есть соответствующая TOAST таблица. Предварительно необходимо выключить TOAST с помощью команды ALTER TABLE имя_таблицы ALTER COLUMN имя_столбца SET STORAGE PLAIN. Обратите внимание, что при изменении режима хранения существующая таблица TOAST не будет удалена. На TOAST таблицу параметр HOLDMEM = ONLY не действует.

    в) При установке атрибута хранения HOLDMEM = POSSIBLY или HOLDMEM = OFF после HOLDMEM = ONLY автоматическое включение поддержки TOAST не производится. При возникновении потребности в такой поддержке ее необходимо включить вручную с помощью команды ALTER TABLE имя_таблицы ALTER COLUMN имя_столбца SET STORAGE.

Для включения и управления алгоритмом вытеснения для таблиц, по возможности хранящихся в памяти, используются параметры в файле конфигурации (подробную информацию см. в подразделе Включение и управление алгоритмом вытеснения параметра HOLDMEM).

Совместимость

Параметр HOLDMEM, так же как и значения OFF, POSSIBLY и ONLY, реализованные в QHB, является расширением стандарта SQL.

См. также

ALTER TABLE