Заметки по использованию Informix Warehouse Accelerator
Для потенциальных и начинающих пользователей Informix Warehouse Accelerator (IWA) - краткая инструкция по применению.
Сперва немного теории...
IWA - это не "куб", агрегаты и производные показатели не хранятся физически, а при необходимости вычисляются по запросу с высокой производительностью (за счёт эффективных алгоритмов параллельной обработки и исключения сканирования ненужной информации).
Горизонтальное масштабирование IWA обеспечивается автоматическим распределением данных между серверами. Все обрабатываемые данные размещаются в оперативной памяти серверов, отдельная копия хранится на дисках (используется при перезапуске IWA - при старте все данные читаются в оперативную память).
Основная единица управления и хранения данных в IWA - Data Mart, или, для краткости, просто Mart. Каждый Mart представляет собой набор связанных таблиц, одна из которых рассматривается как таблица "фактов", а остальные - таблицы "размерностей". Связи между таблицей "фактов" и таблицами "размерностей" могут не быть созданы как ограничения (constraints) Informix, но должны быть определены при создании Mart. Также в Mart могут быть включены не все колонки исходных таблиц Informix.
Данные в Mart первоначально загружаются из таблиц Informix. Последующее обновление может осуществляться по команде администратора либо на основе расписания.
Дополнительно поддерживается автоматическая фоновая загрузка новых (вставленных) данных из исходных таблиц в Mart (обновление и удаление существующих данных требует стандартной перезагрузки Mart). Фоновую загрузку новых данных необходимо выключить в момент ручного либо регламентного (по расписанию) полного обновления Mart.
Средствами IWA обеспечивается ускорение запросов и подзапросов (SELECT, sub-SELECT), которые могут быть выполнены над данными одного Mart (т.е. с использованием таблиц, колонок и связей, входящих в состав одного из существующих Mart).
Ускорение IWA по умолчанию выключено, и может быть явно активировано на уровне пользовательской сессии путём выполнения специальной команды. Есть также команда для выключения ускорения IWA.
Пользовательские запросы поступают на сервер Informix, который проверяет возможность и целесообразность использования IWA, и, при положительном результате проверки, перенаправляет запрос IWA на выполнение.
Теперь практическая часть...
Инсталляция IWA осуществляется в соответствии с документацией. Подключение IWA к серверу Informix осуществляется с использованием OAT (Informix Open Admin Tool), либо с помощью встроенной функции ifx_setupDWA. Параметры вызова определяются путём запуска команды ondwa getpin на стороне сервера IWA.
Краткое описание тестовой таблицы в Informix: 42 колонки, 28 млн. строк, суммарный объем данных 14 Гбайт.
Для таблиц (в нашем случае - одной таблицы), входящей в состав Mart, необходимо подготовить XML-документ с описанием включаемых в состав Mart данных (перечень таблиц, перечень колонок, описание связей). Пример XML-документа приведён в документации, дублирую этот пример здесь:
В нашем примере с одной таблицей достаточно указать схему и имя таблицы, установить признак isFactTable=true и перечислить необходимые (все) колонки.
Далее создание Mart, первоначальная загрузка в него данных и настройка автоматической фоновой загрузки новых данных в созданный Mart осуществляется следующими командами:
В примере выше:
Принудительное обновление данных Mart может быть осуществлено следующими командами:
В этом примере:
Ускорение пользовательских запросов с помощью IWA включается с помощью переменной сессии use_dwa:
Время выполнения приведённого выше запроса на системе с 16 процессорными ядрами для нашей таблицы в 28 млн. записей - в пределах 1 секунды.
Без использования IWA даже при использовании специальных мер физической оптимизации схемы данных (набор индексов, партиционирование данных, использование параллелизма выполнения запроса) время выполнения такого запроса будет весьма значительным из-за необходимости сканирования большого объема данных.
Сперва немного теории...
IWA представляет собой горизонтально масштабируемую систему для ускорения сложных "аналитических" запросов к данным, организованным в соответствии со звездообразной (star) либо snowflake схемой данных.
Копия части данных Informix хранился в специальном (поколоночном, сжатом) формате на серверах, выделенных для работы IWA (конфигурация по умолчанию - размещение IWA на том же сервере, на котором установлен Informix).
Копия части данных Informix хранился в специальном (поколоночном, сжатом) формате на серверах, выделенных для работы IWA (конфигурация по умолчанию - размещение IWA на том же сервере, на котором установлен Informix).
IWA - это не "куб", агрегаты и производные показатели не хранятся физически, а при необходимости вычисляются по запросу с высокой производительностью (за счёт эффективных алгоритмов параллельной обработки и исключения сканирования ненужной информации).
Горизонтальное масштабирование IWA обеспечивается автоматическим распределением данных между серверами. Все обрабатываемые данные размещаются в оперативной памяти серверов, отдельная копия хранится на дисках (используется при перезапуске IWA - при старте все данные читаются в оперативную память).
Основная единица управления и хранения данных в IWA - Data Mart, или, для краткости, просто Mart. Каждый Mart представляет собой набор связанных таблиц, одна из которых рассматривается как таблица "фактов", а остальные - таблицы "размерностей". Связи между таблицей "фактов" и таблицами "размерностей" могут не быть созданы как ограничения (constraints) Informix, но должны быть определены при создании Mart. Также в Mart могут быть включены не все колонки исходных таблиц Informix.
Данные в Mart первоначально загружаются из таблиц Informix. Последующее обновление может осуществляться по команде администратора либо на основе расписания.
Дополнительно поддерживается автоматическая фоновая загрузка новых (вставленных) данных из исходных таблиц в Mart (обновление и удаление существующих данных требует стандартной перезагрузки Mart). Фоновую загрузку новых данных необходимо выключить в момент ручного либо регламентного (по расписанию) полного обновления Mart.
Средствами IWA обеспечивается ускорение запросов и подзапросов (SELECT, sub-SELECT), которые могут быть выполнены над данными одного Mart (т.е. с использованием таблиц, колонок и связей, входящих в состав одного из существующих Mart).
Ускорение IWA по умолчанию выключено, и может быть явно активировано на уровне пользовательской сессии путём выполнения специальной команды. Есть также команда для выключения ускорения IWA.
Пользовательские запросы поступают на сервер Informix, который проверяет возможность и целесообразность использования IWA, и, при положительном результате проверки, перенаправляет запрос IWA на выполнение.
Теперь практическая часть...
Инсталляция IWA осуществляется в соответствии с документацией. Подключение IWA к серверу Informix осуществляется с использованием OAT (Informix Open Admin Tool), либо с помощью встроенной функции ifx_setupDWA. Параметры вызова определяются путём запуска команды ondwa getpin на стороне сервера IWA.
Краткое описание тестовой таблицы в Informix: 42 колонки, 28 млн. строк, суммарный объем данных 14 Гбайт.
Для таблиц (в нашем случае - одной таблицы), входящей в состав Mart, необходимо подготовить XML-документ с описанием включаемых в состав Mart данных (перечень таблиц, перечень колонок, описание связей). Пример XML-документа приведён в документации, дублирую этот пример здесь:
<?xml version="1.0" encoding="UTF-8" ?>
<dwa:martModel xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
<mart name="orders_customer_mart">
<table name="customer" schema="informix" isFactTable="false" >
<column name="customer_num"/>
<column name="fname"/>
<column name="lname"/>
<column name="state"/>
</table>
<table name="orders" schema="informix" isFactTable="true" >
<column name="customer_num"/>
<column name="ship_date"/>
<column name="ship_weight"/>
</table>
<reference
referenceType="LEFTOUTER"
isRuntimeJoin="true"
parentCardinality="1"
dependentCardinality="n"
dependentTableSchema="informix"
dependentTableName="orders"
parentTableSchema="informix"
parentTableName="customer">
<parentColumn name="customer_num"/>
<dependentColumn name="customer_num"/>
</reference>
</mart>
</dwa:martModel>
В нашем примере с одной таблицей достаточно указать схему и имя таблицы, установить признак isFactTable=true и перечислить необходимые (все) колонки.
Далее создание Mart, первоначальная загрузка в него данных и настройка автоматической фоновой загрузки новых данных в созданный Mart осуществляется следующими командами:
dbaccess demo -
EXECUTE FUNCTION ifx_createMart('iwa', filetoclob('nl_mart.xml', 'NL_MART'));
EXECUTE FUNCTION ifx_loadMart('iwa', 'nl_mart', 'NONE');
EXECUTE FUNCTION ifx_setupTrickleFeed('iwa', 'nl_mart', 60);
В примере выше:
- demo - имя базы данных,
- iwa - имя ускорителя IWA,
- nl_mart.xml - имя файла с XML-конфигурацией для Mart, размещённого на стороне сервера Informix,
- nl_mart - имя Mart, прописанное в файле XML-конфигурации в атрибуте name тега mart,
- ifx_createMart - функция создания нового Mart,
- ifx_loadMart - функция первичной загрузки данных в Mart,
- ifx_setupTrickleFeed - функция настройки автоматической фоновой загрузки новых данных в Mart.
Принудительное обновление данных Mart может быть осуществлено следующими командами:
dbaccess demo -
EXECUTE FUNCTION ifx_removeTrickleFeed('iwa', 'nl_mart');
EXECUTE FUNCTION ifx_refreshMart('iwa', 'nl_mart', 'MART', NULL);
В этом примере:
- ifx_removeTrickleFeed - функция отключения автоматической фоновой загрузки новых данных в Mart (несовместимой с ручным обновлением),
- ifx_refreshMart - функция обновления данных в Mart.
Ускорение пользовательских запросов с помощью IWA включается с помощью переменной сессии use_dwa:
dbaccess demo -
set environment use_dwa 'accelerate on';
SELECT org1, org2, SUM(pay_all), COUNT(DISTINCT dept) FROM demotab WHERE pay_rev <= 8421
GROUP BY org1, org2 HAVING SUM(pay_all) > 8028151025
ORDER BY SUM(pay_all) DESC;
GROUP BY org1, org2 HAVING SUM(pay_all) > 8028151025
ORDER BY SUM(pay_all) DESC;
Время выполнения приведённого выше запроса на системе с 16 процессорными ядрами для нашей таблицы в 28 млн. записей - в пределах 1 секунды.
Без использования IWA даже при использовании специальных мер физической оптимизации схемы данных (набор индексов, партиционирование данных, использование параллелизма выполнения запроса) время выполнения такого запроса будет весьма значительным из-за необходимости сканирования большого объема данных.