zinal: (default)
Maksim Zinal ([personal profile] zinal) wrote2016-10-19 05:26 pm
Entry tags:

Заметки по использованию Informix Warehouse Accelerator

Для потенциальных и начинающих пользователей Informix Warehouse Accelerator (IWA) - краткая инструкция по применению.

Сперва немного теории...

IWA представляет собой горизонтально масштабируемую систему для ускорения сложных "аналитических" запросов к данным, организованным в соответствии со звездообразной (star) либо snowflake схемой данных.

Копия части данных 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;

Время выполнения приведённого выше запроса на системе с 16 процессорными ядрами для нашей таблицы в 28 млн. записей - в пределах 1 секунды.
Без использования IWA даже при использовании специальных мер физической оптимизации схемы данных (набор индексов, партиционирование данных, использование параллелизма выполнения запроса) время выполнения такого запроса будет весьма значительным из-за необходимости сканирования большого объема данных.

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org