Добрый день, коллеги. Сегодня хотелось бы поговорить о такой регулярной и важной операции происходящей в базе данных SAP HANA, как Delta Merge.
В концепции базы данных HANA, изменения в колоночных таблицах не происходят напрямую в основном хранилище (Main store). Это происходит потому, что область MAIN оптимизирована для операций чтения, а не записи. Все операции записи происходят в специальной области, которая называется Delta store. При этом операции чтения производятся из обеих областей.
Периодически необходимо обновлять основную область хранения колоночных таблиц (main store) содержимым области delta store. Процесс слияния этих двух областей называется delta merge. Этот процесс можно разбить на три этапа: операция, производимая непосредственно до слияния, во время слияния и после слияния. Схематично процесс delta merge можно представить следующим образом:
На первом этапе (до начала операции delta merge) мы видим, что есть две области Main1 и Delta1. Чтение производится из обеих областей, а вот запись происходит только в область Delta1.
В процессе операции delta merge, создается дополнительно две области Main2 и Delta2. При этом содержимое области Main1 копируется в Main2 (Операция 1). Зафиксированные изменения (committed) из Delta1 копируются в область Main2 (Операция 2). Незафиксированные изменения (uncommitted) из Delta 1 копируются в область Delta2 (Операция 3). На этом этапе операции чтения выполняются из трёх областей Main1, Delta1, Delta2. Запись осуществляется в Delta2.
На последнем этапе, после завершения операции слияния, области Main1 и Delta1 удаляются. Чтение осуществляется из областей Main2 и Delta2. Запись осуществляется в область Delta2.
Благодаря такой схеме, таблица (или секция) при операции delta merge блокируется два раза на короткое время. В начале, когда незавершенные транзакции перемещаются из Delta1 в Delta2 и в конце, когда области меняются.
Ниже пердставлены различные типы операции Delta Merge.
Итак, все типы операций слияния делятся на автоматичекие и ручные. Автоматические опреации выполняются специальных процессом mergedog, а ручные выполняются с помощью SQL. Помимо тех типов, что представлены на картинке выше существует еще неявная (implicit) операция merge, она не зависит от mergedog и ручного срабатывания, и выполняется в таких операциях как Recovery и Log replay.
Автоматическая операция Delta merge
Автоматическая операция delta merge срабатывает в двух случаях, в нормальных условиях операция вызывается регулярно (Auto), через определенный промежуток времени, установленный параметром, а также в критических ситуациях (Critical), для недопущения нестабильности в работе системы. Критические условия срабатывания также определяются параметрами.
Auto merge. Выполнение автоматической операции MERGE определяется следующими параметрами:
indexserver.ini -> [mergedog] -> activate (boolean), default: true
indexserver.ini -> [mergedog] -> check_interval (ms), default: 60000
indexserver.ini -> [mergedog] -> auto_merge_decision_func
Для выполнения автоматической операции слияния параметр активации в разделе [mergedog] должен быть установлен в значение true. По умолчанию каждую минуту (параметр check_interval) просыпается процесс mergedog и проверяет условия для запуска операции merge по отдельной таблице или секции. Условия для срабатывания операции Auto merge определяются параметром auto_merge_decision_func.
Critical merge. Критическая операция MERGE выполняется процессом mergedog для предотвращения нестабильности в работе системы. Условия для срабатывания операции Critical merge определяются параметром:
indexserver.ini -> [mergedog] -> critical_merge_decision_func
Ручная операция Delta Merge
Существует возможность ручного запуска операций DELTA MERGE. Есть несколько типов ручных операций:
Hard и Force merge
Выполняется в исключительных ситуациях, например, когда есть проблемы с запуском автоматической операции MERGE. Hard merge можно запустить с помощью следующей команды:
MERGE DELTA OF “<table_name>” [FORCE REBUILD]
В таком случае операция DELTA MERGE будет выполнена при наличии необходимых системных ресурсов или (в случае их отсутствия) как только эти ресурсы будут доступны. Опция FORCE REBUILD используется для того, чтобы гарантировать выполнение операции delta merge, даже если не соблюдены некоторые условия, например, есть несоответствие с функцией принятия решения (decision function), а также несоответствие количеству измененных строк.
Если при выполнении команды добавить WITH PARAMETERS (‘FORCED_MERGE’ = ‘ON’) будет выполнена операция FORCED MERGE, при этом операция будет запущена в независимости от доступности системных ресурсов.
Smart merge
Стандартный подход к операции merge при котором сама операция контролируется приложением. Этот подход применяется в определенных сценариях, таких как загрузка данных в BW. В этом сценарии автоматическая операция слияния может оказать негативный эффект на производительность процесса загрузки. Для того чтобы убедиться, что Smart merge работает, необходимо проверить установку двух параметров.
indexserver.ini -> [mergedog] -> smart_merge_enabled
indexserver.ini -> [mergedog] -> smart_merge_decision_func
Smart merge можно запустить с помощью следующей команды:
MERGE DELTA OF “<table_name>” WITH PARAMETERS (‘SMART_MERGE’ = ‘ON’)
Внимание! Необходимо убедится, что автоматическая операция слияния по таблице или секции отключена.
В окружении SAP ABAP вы можете использовать функциональный модуль TREX_EXT_MERGE_DELTA_INDEX для срабатывания smart merge из приложения.
Memory merge
До версии SAP HANA 1.0 SP8 была доступна ручная операция Memory merge, она является разновидностью Hard merge. В связи с тем, что эта версия базы данных является устаревшей и более не поддерживается, подробнее рассматривать эту операцию нет необходимости.
Внимание! Все ручные операции слияния после своего завершения не выполняют операцию по оптимизации сжатия таблицы. Таким образом для оптимизации сжатия таблицы, вам необходимо запустить это задание вручную.
Merge Monitor
Операция слияния для колоночных таблиц потенциально может быть весьма дорогостоящей и должна выполняться только при наличие необходимых системных ресурсов. За это отвечает Merge Monitor.
База данных использует стоимостную функцию (подробнее о стоимостной функции можно прочитать в ноте 2057046) для того, чтобы определить над какой таблицей необходимо произвести слияние, когда и в каком порядке. Эта же функция контролирует количество таблиц, которые могут быть слиты одновременно и сколько потоков для операции слияния может быть использовано для одной таблицы.
Все запросы на слияние должны получить токен слияния (разрешение) от Merge монитора. Для всех операций слияния необходим merge token, исключение составляет лишь операция FORCE MERGE. Merge монитор блокирует запросы на операцию слияния если не все системные ресурсы доступны или по таблице уже производится операция слияния. Количество токенов доступных для выделения зависит от доступных системных ресурсов. Периодически это число пересчитывается, основываясь на стоимостной функции, которую можно посмотреть в параметре load_balancing_func в indexserver.ini. Для каждой операции merge, система вычисляет необходимое количество токенов. Если системе не удается подсчитать количество необходимых токенов, то значение берется из параметра token_per_table.
Записи об операциях Delta Merge, можно найти в представлении M_DELTA_MERGE_STATISTICS, данные в представлении отображаются с момента запуска базы данных. Для доступа к историческим данным необходимо обратиться к представлению HOST_DELTA_MERGE_STATISTICS схемы _SYS_STATISTICS. Не все записи в этих представлениях относятся непосредственно к операции Merge. Для поиска операций Merge в поле TYPE необходимо указать ‘MERGE’. Кратко про остальные типы операций в таблице ниже:
Для мониторинга процесса Delta Merge можно обратиться к представлению M_JOB_PROGRESS.
Необходимо понимать, что при выполнении операции Delta merge потребуется больше места как в памяти, так и на диске. Вычислить необходимый объем можно по следующей формуле: размер в области main (текущий) + размер в области main (будущий) + размер delta. Также понадобится дополнительное пространство для временных вычислений, его можно определить как равное размеру самого большого поля в таблице.
За операцией delta merge может последовать операция компрессии (TYPE='SPARSE' в представлении M_DELTA_MERGE_STATISTICS), которая потребует дополнительного пространства в аллокаторе Pool/OptimizeCompression/<schema>:<table>. В зависимости от сценария сжатия, этот размер может быть существенно больше размера самой таблицы.
Ошибки операции Delta Merge
Операция Delta Merge может завершиться ошибкой по нескольким причинам. Детальную информацию по ошибке можно найти в полях LAST_ERROR и ERROR_DESCRIPTION представления M_DELTA_MERGE_STATISTICS и исторического представления HOST_DELTA_MERGE_STATISTICS. Также можно воспользоваться стандартным SQL скриптом HANA_Tables_ColumnStore_Merges. Описание ошибок и рекомендации по их устранению можно найти в ноте
SAP KBA 2057046 – FAQ: SAP HANA Delta Merges
В данной статье мы кратко рассмотрели операцию слияния данных колоночных таблиц в базе данных HANA. Операция delta merge является крайне важной не только для стабильной работы, но производительности системы. По этому эта операция должна всегда находится в фокусе администратора группы Basis, а также специалистов BW и разработчиков приложений.