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

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

В 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.

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

use_possible_buffer (boolean)

Логический параметр. При установке значения в TRUE будет использоваться этот кэш.

qhb_possible_buffers_size (integer)

Общий размер буферного кэша.

shared_buffers_partitions (integer)

Используется общий параметр с TARQ - размер фрагментов кэша (партиций; не имеют отношения к партициям таблицы).

Обращение к каждому фрагменту происходит независимо от остальных. Слишком большой размер партиций приведет к возрастанию конкуренции за блокировки, слишком маленький может привести к задержкам, если в партиции не окажется пригодных к вытеснению блоков (все «грязные» или занятые фоновым процессом).

Рекомендуемое значение: 128.

use_qhb_onlymem_cache (boolean)

Логический параметр. При установке значения в TRUE будет использоваться этот кэш.

qhb_onlymem_cache_size (integer)

Общий размер буферного кэша.

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

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

См. также

ALTER TABLE