Использование таблиц в памяти
Таблицы в памяти полезны в случае необходимости высокопроизводительного манипулирования временными данными. Таблицы в памяти не подходят для длительного хранения данных, т.к. очищаются при перезапуске ядра СУБД, но работают быстрее обычных таблиц за счет преимущества в скорости оперативной памяти перед файловой системой. Примером использования таблиц в памяти может являться подготовка данных для отчетов или подготовка данных из различных источников перед загрузкой их в основное хранилище внутри одной транзакции.
По умолчанию СУБД ЛИНТЕР не предусматривает работу с таблицами «в памяти». Для поддержки этой функциональности необходимо:
-
сконфигурировать СУБД с помощью утилиты 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;
-
-
установить максимально допустимое количество страниц в пуле страниц ядра СУБД ЛИНТЕР для таблицы «в памяти».
При каждом запуске ядра СУБД ЛИНТЕР указывать ключ
/INMEMPOOL=< размер >
, где< размер >
задает максимально допустимое количество страниц в пуле страниц ядра СУБД, выделяемых для размещения таблиц «в памяти» (см. документ «Запуск и останов СУБД ЛИНТЕР в среде ОС Windows») либо установить через интерфейс приложения «Администратор СУБД ЛИНТЕР». Значение задается в страницах размером 4 Кбайт.Для расчета значения количества страниц можно воспользоваться следующим алгоритмом:
-
вычислить максимальный объем, занимаемый одной записью таблицы, сложив максимальный размер каждого столбца;
-
умножить значение из предыдущего пункта на максимальное предполагаемое количество строк в таблице;
-
таким образом, получаем размер памяти, занимаемый одной таблицей;
-
повторить предыдущие пункты для всех таблиц «в памяти»;
-
сложить значения размеров памяти для всех таблиц «в памяти» и разделить на размер страницы 4 Кбайт;
-
полученное значение будет являться максимальным количеством необходимых страниц, которое необходимо установить в значении ключа
/INMEMPOOL
, добавив некоторый запас.
В виде формулы описанный алгоритм имеет следующий вид:
где
– количество таблиц;
– максимальное количество строк i-й таблицы;
– количество столбцов i-й таблицы;
– максимальный размер значения j-го столбца i-й таблицы в байтах.
Пример
linter /INMEMPOOL=100000
Также настроить параметр можно через интерфейс приложения «Администратор СУБД ЛИНТЕР»:
Рисунок 8. Установка параметров таблиц в памяти
-
-
в случае активной работы с таблицами «в памяти» рекомендуется увеличить размер памяти канала, выполнив команду:
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 КОД_ОШИБКИ".
Более подробное описание можно найти в документации: