Использование таблиц в памяти

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

По умолчанию СУБД ЛИНТЕР не предусматривает работу с таблицами «в памяти». Для поддержки этой функциональности необходимо:

  1. сконфигурировать СУБД с помощью утилиты gendb (см. документ «СУБД ЛИНТЕР. Создание и конфигурирование базы данных). Установить значения следующих параметров:

    • задать размер очереди для таблиц «в памяти» (команда вида SET IN-MEMORY TABLES;);

    • задать количество столбцов у таблиц «в памяти» (команда вида SET IN-MEMORY COLUMNS;);

    • задать количество файлов (команда вида SET IN-MEMORY FILES;).

    Пример

    set in-memory tables 30;
    set in-memory files 60;
    set in-memory columns 300;
  2. установить максимально допустимое количество страниц в пуле страниц ядра СУБД ЛИНТЕР для таблицы «в памяти».

    При каждом запуске ядра СУБД ЛИНТЕР указывать ключ /INMEMPOOL=< размер >, где < размер > задает максимально допустимое количество страниц в пуле страниц ядра СУБД, выделяемых для размещения таблиц «в памяти» (см. документ «СУБД ЛИНТЕР. Запуск и останов СУБД ЛИНТЕР в среде ОС Windows») либо установить через интерфейс приложения «Администратор СУБД ЛИНТЕР». Значение задается в страницах размером 4 Кбайт.

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

    • вычислить максимальный объем, занимаемый одной записью таблицы, сложив максимальный размер каждого столбца;

    • умножить значение из предыдущего пункта на максимальное предполагаемое количество строк в таблице;

    • таким образом, получаем размер памяти, занимаемый одной таблицей;

    • повторить предыдущие пункты для всех таблиц «в памяти»;

    • сложить значения размеров памяти для всех таблиц «в памяти» и разделить на размер страницы 4 Кбайт;

    • полученное значение будет являться максимальным количеством необходимых страниц, которое необходимо установить в значении ключа /INMEMPOOL, добавив некоторый запас.

    В виде формулы описанный алгоритм имеет следующий вид:

    где

    – количество таблиц;

    – максимальное количество строк i-й таблицы;

    – количество столбцов i-й таблицы;

    – максимальный размер значения j-го столбца i-й таблицы в байтах.

    Пример

    linter /INMEMPOOL=100000

    Также настроить параметр можно через интерфейс приложения «Администратор СУБД ЛИНТЕР»:

    Установка параметров таблиц в памяти
    Рисунок 8. Установка параметров таблиц в памяти

  3. в случае активной работы с таблицами «в памяти» рекомендуется увеличить размер памяти канала, выполнив команду:

    ALTER DATABASE SET CHANNEL MEMORY LIMIT 1048576;

    и перезапустить ядро СУБД.

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

    SAVE TABLE < имя_таблицы >;

    а для восстановления сохраненной ранее таблицы необходимо выполнить команду:

    RESTORE TABLE < имя_таблицы >;

    Для автоматической загрузки и сохранения данных таблиц «в памяти» можно воспользоваться опциями таблиц «в памяти»: AUTOLOAD и AUTOSAVE. Операции над таблицами «в памяти» не являются транзакционными, на них не действуют операции COMMIT и ROLLBACK. При ошибке операции над таблицей «в памяти» может быть выполнено автоматическое восстановление к старому состоянию, при этом на консоль ядра и в linter.out выдается сообщение: "In-memory table ИМЯ_ТАБЛИЦЫ was rolled back to last saved/initial state after error КОД_ОШИБКИ".

Более подробное описание можно найти в документации: