Партиционирование ================== Плагин **PXF JDBC** поддерживает одновременный доступ к внешней таблице на чтение из нескольких узлов **PXF**. Такая функция называется партиционированием. Синтаксис ---------- Для активации партиционирования необходимо использовать следующие параметры **: :: &PARTITION_BY=: &RANGE=: [&INTERVAL=[:]] Параметр *PARTITION_BY* указывает, какой столбец используется в качестве столбца партиционирования (можно использовать только один столбец): + ** -- имя столбца, по которому производится партиционирование; + ** -- тип данных столбца **. Поддерживаемые типы: *INT*, *DATE* и *ENUM*. Параметр *RANGE* указывает диапазон данных для запроса: + Если тип партиционирования -- *ENUM*, параметр *RANGE* должен быть списком значений, каждое из которых формирует собственную партицию; + Если тип партиционирования -- *INT* или *DATE*, параметр *RANGE* должен быть конечным замкнутым слева диапазоном (*... >= start_value AND ... < end_value*); + Для типа партиционирования *DATE* формат даты должен быть *yyyy-MM-dd*. Параметр *INTERVAL* необходим для партиционирований типа *INT* и *DATE* и игнорируется в случае, если ** является *ENUM*: + ** -- размер каждой партиции (если данное значение не кратно параметру *RANGE*, последняя партиция будет меньшего размера); + ** должен быть указан, если тип ** является *DATE*, и допустимые значения -- *year*, *month* и *day*. Параметр игнорируется для других типов данных столбца партиции. Примеры выражений, задающих параметры партиционирования: :: &PARTITION_BY=id:int&RANGE=42:142&INTERVAL=2 :: &PARTITION_BY=createdate:date&RANGE=2008-01-01:2010-01-01&INTERVAL=1:month :: &PARTITION_BY=grade:enum&RANGE=excellent:good:general:bad Механизм работы ---------------- При активированном партиционировании запрос *SELECT* разбивается на набор отдельных запросов, каждый из которых называется партицией (или фрагментом). Все фрагменты одновременно обрабатываются отдельными инстансами **PXF**. В случае превышения числа фрагментов над числом инстансов **PXF**, некоторые инстансы обрабатывают более одного фрагмента (по очереди); а в случае только одного инстанса **PXF**, все фрагменты обрабатываются им. Распределение фрагментов по инстансам происходит в процессе исполнения запроса. Дополнительно к каждому фрагменту автоматически добавляются параметры запроса (с выражением *WHERE*) для гарантии, что каждый набор данных извлекается из внешнего источника ровно один раз. Пример партиционирования ------------------------- В качестве примера дана следующая таблица **MySQL**: :: CREATE TABLE sales ( id int primary key, cdate date, amt decimal(10,2), grade varchar(30) ) И внешняя таблица **ADB**: :: CREATE EXTERNAL TABLE sales( id integer, cdate date, amt float8, grade text ) LOCATION ('pxf://sales?PROFILE=JDBC&JDBC_DRIVER=com.mysql.jdbc.Driver&DB_URL=jdbc:mysql://192.168.200.6:3306/demodb&PARTITION_BY=cdate:date&RANGE=2008-01-01:2010-01-01&INTERVAL=1:year') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); На основе приведенных таблиц плагин **PXF JDBC** генерирует два фрагмента для запроса "SELECT * FROM sales". Затем **HAWQ** назначает каждый из них отдельному узлу **PXF**. Каждый узел выполняет запрос *SELECT*, первый получает записи с значениями *cdate* за *2008* год, а второй -- за *2009* год. Затем каждый узел **PXF** отправляет свои результаты обратно в **HAWQ**, где они "сцепляются" и возвращаются в **ADB**.