PostgreSQL коннектор#

PostgreSQL коннектор позволяет отправлять запросы и создавать таблицы в СУБД PostgreSQL. Коннектор может быть использован для объединения данных из PostgreSQL с данными из других источников.

Требования#

  • Сервер PostgreSQL версии 10.x или выше.

  • Наличие сетевого доступа к PostgreSQL со всех узлов CedrusData (coordinator и worker). По умолчанию, PostgreSQL использует порт 5432.

Конфигурация#

Для создания каталога PostgreSQL установите параметр connector.name в значение postgresql. Например, для конфигурации каталога с именем example создайте файл etc/catalog/example.properties со следующим содержимым. Замените параметры подключения в соответствии с конфигурацией вашего сервера PostgreSQL.

connector.name=postgresql
connection-url=jdbc:postgresql://example.net:5432/database
connection-user=root
connection-password=secret

Параметр connection-url определяет JDBC строку подключения к серверу PostgreSQL. Вы можете ознакомиться с полным списком допустимых параметров в документации JDBC драйвера PostgreSQL.

Параметры connection-user and connection-password определяют имя пользователя и пароль для подключения к экземпляру PostgreSQL (как правило это сервисный пользователь). Если не хотите хранить имя пользователя и пароль в открытом виде воспользуйтесь функционалом передачи секретов через переменные окружения.

Безопасность#

Если ваш экземпляр PostgreSQL сконфигурирован с использованием TLS сертификатов, вы можете включить поддержку TLS между кластером CedrusData и PostgreSQL путем добавления необходимых параметров к строке подключения, указанной в connection-url.

Например, для драйвера PostgreSQL версии 42 вы можете включить поддержку TLS путем добавления параметра ssl=true.

connection-url=jdbc:postgresql://example.net:5432/database?ssl=true

Вы можете ознакомиться с полным списком допустимых параметров в документации JDBC драйвера PostgreSQL.

Аутентификация в источнике данных#

Вы можете предоставить имя пользователя и пароль для подключения к источнику данных несколькими способами:

  • INLINE - в файле конфигурации каталога (в том числе, используя секреты, что бы не хранить значения в открытом виде).

  • FILE - в отдельном properties файле.

  • KEYSTORE - в зашифрованном keystore файле.

  • Из extra credentials клиента CedrusData.

The following table describes configuration properties for connection credentials:

Property name

Description

credential-provider.type

Тип credential provider. Допустимые значения: INLINE (значение по умолчанию), FILE или KEYSTORE.

connection-user

Имя пользователя для подключения к источнику. Используется при credential-provider.type=INLINE.

connection-password

Пароль для подключения к источнику. Используется при credential-provider.type=INLINE.

connection-credential-file

Путь к properties файлу, содержащему параметры connection-user and connection-password. Используется при credential-provider.type=FILE.

keystore-file-path

Путь к keystore файлу, из которого следует прочитать имя пользователя и пароль. Используется при credential-provider.type=KEYSTORE.

keystore-type

Тип keystore файла. Например, JKS или PEM.

keystore-password

Пароль к keystore файлу.

keystore-user-credential-name

Имя keystore entity, содержащей имя пользователя для подключения к источнику.

keystore-user-credential-password

Пароль к keystore entity, содержащей имя пользователя для подключения к источнику

keystore-password-credential-name

Имя keystore entity, содержащей пароль для подключения к источнику.

keystore-password-credential-password

Пароль к keystore entity, содержащей пароль для подключения к источнику.

user-credential-name

Имя параметра extra credentials, значение которого следует использовать в качестве имени пользователя. См. extraCredentials в разделе Параметры подключения.

password-credential-name

Имя параметра extra credentials, значение которого следует использовать в качестве пароля. См. extraCredentials в разделе Параметры подключения.

Несколько серверов PostgreSQL#

PostgreSQL коннектор может работать только с одним экземпляром PostgreSQL. Если у вас есть несколько экземпляров PostgreSQL вам следует сконфигурировать несколько каталогов PostgreSQL коннектора, каждый из которых будет работать с конкретным экземпляром PostgreSQL.

Общие параметры конфигурации#

Общие параметры конфигурации каталога приведены в таблице ниже:

Название

Описание

Значение по умолчанию

case-insensitive-name-matching

Включить поддержку case insensitive идентификаторов.

false

case-insensitive-name-matching.cache-ttl

Время жизни закэшированных метаданных о case insensitive идентификаторах.

1m

case-insensitive-name-matching.config-file

Путь к файлу конфигурации в формате JSON, который позволяет разрешать конфликты имен между case insensitive схемами и таблицами.

null

case-insensitive-name-matching.config-file.refresh-period

Частота проверки обновлений файла case-insensitive-name-matching.config-file.

0 (refresh disabled)

metadata.cache-ttl

Время жизни закэшированных метаданных. Положительное значение включает кэширование.

0 (caching disabled)

metadata.cache-missing

Кэшировать ли информацию о том, что для используемых таблиц и колонок отсутствуют статистики. Включение данного параметра может ускорить планирование некоторых запросов. Однако, если информация об отсутствии статистик для конкретного объекта СУБД закэширована, но статистики стали доступны позднее (например, была запущена команда ANALYZE), CedrusData не сможет использовать статистики, пока не истечет время жизни закэшированной записи в соответствии с metadata.cache-ttl.

false

metadata.cache-maximum-size

Максимальное количество объектов, хранящихся в metadata cache.

10000

write.batch-size

Максимальное количество команд в batch операциях записи данных. Изменение данного параметра не рекомендовано, так как оно может негативно сказаться на производительности.

1000

dynamic-filtering.enabled

Использовать ли динамические фильтры при работе с JDBC источником.

true

dynamic-filtering.wait-timeout

Максимальное время ожидания готовности динамических фильтров с build стороны оператора join перед запуском JDBC запроса к источнику. Увеличение таймаута может позволить CedrusData выполнить запрос к источнику с более селективными фильтрами, но в то же время может увеличить latency некоторых запросов.

20s

Domain compaction threshold#

CedrusData позволяет делегировать применение предикатов источнику данных (pushdown). Во многих случаях это существенно уменьшает количество записей, которые возвращает источник, и улучшает производительность. Однако, pushdown сложных предикатов (например, выражение IN со множеством значений) может негативно сказаться на производительности. При достижении порога сложности предиката, CedrusData автоматически преобразует предикат к более компактной форме. Например, предикат a IN (1, 2, ..., 100) может быть преобразован в a BETWEEN 1 AND 100. В большинстве случаев такое преобразование улучшает производительность запросов. Однако, в некоторых случаях может быть предпочтительнее передать сложный предикат в неизменном виде, так как источник данных может его обработать эффективнее, чем преобразованный предикат.

Вы можете увеличить значение порога сложности, что бы CedrusData передавал предикат в источник без изменений. Используйте для этого параметр конфигурации каталога domain-compaction-threshold или параметр сессии domain_compaction_threshold catalog session property.

Процедуры#

  • system.flush_metadata_cache()

    Очистить кэш JDBC метаданных. Команда ниже очищает кэш метаданных всех схем в каталоге example.

    USE example.example_schema;
    CALL system.flush_metadata_cache();
    

Case insensitive идентификаторы#

Когда параметр конфигурации case-insensitive-name-matching установлен в true, CedrusData может обращаться к схемам и таблицам источника, имена которых на являются lowercase. Для этого CedrusData сопоставляет lowercase название схемы или таблицы с ее реальным названием в источнике данных. Например, если таблица в источнике данных имеет название Customers, CedrusData позволяет обратиться к ней по имени customers.

В случае, если источник имеет несколько объектов, имена которых отличаются только регистром (например, Customer и customer), CedrusData не может автоматически определить, к какому объекту обращаться.

В этом случае вы можете явно задать сопоставление имен в помощью файла в JSON формате, путь к которому следует указать в параметре конфигурации каталога case-insensitive-name-matching.config-file. Например:

{
  "schemas": [
    {
      "remoteSchema": "CaseSensitiveName",
      "mapping": "case_insensitive_1"
    },
    {
      "remoteSchema": "cASEsENSITIVEnAME",
      "mapping": "case_insensitive_2"
    }],
  "tables": [
    {
      "remoteSchema": "CaseSensitiveName",
      "remoteTable": "tablex",
      "mapping": "table_1"
    },
    {
      "remoteSchema": "CaseSensitiveName",
      "remoteTable": "TABLEX",
      "mapping": "table_2"
    }]
}

В данном случае, при обращении из CedrusData к схеме case_insensitive_1, запрос будет переадресован к схеме источника CaseSensitiveName, а при обращении из CedrusData к таблице case_insensitive_1.table_1 запрос будет переадресован к таблице источника CaseSensitiveName.tablex.

По умолчанию если вы изменяете содержимое данного файла, экземпляр CedrusData должен быть перезапущен, что бы применить изменения. Если вы хотите изменять содержимое файла без перезапуска CedrusData, вы можете установить параметр конфигурации case-insensitive-name-mapping.refresh-period, который определяет частоту повторного чтения данного файла.

case-insensitive-name-mapping.refresh-period=30s

Нетракзакционный INSERT#

Коннектор поддерживает добавление записей в источник с помощью команды INSERT statements. По умолчанию CedrusData осуществляет запись данных, используя временную таблицу, что обеспечивает транзакционные гарантии: в источник будут записаны либо все данные, либо не будет записано ничего (в случае возникновения ошибки). Однако,

Вы можете осуществлять запись данных в таблицу источника напрямую, минуя временную таблицу. Для этого установите параметр конфигурации каталога insert.non-transactional-insert.enabled или параметр сессии non_transactional_insert в значение true. Изменение данного параметра может улучшает производительность записи, но так же может привести данные в источнике в неопределенное состояние при возникновении ошибки в момент записи. Например, если при вставке 10 записей в таблицу источника в середине процесса произошла ошибка, откат вставки уже сохраненных записей может оказаться невозможным, и после выполнения команды источник будет содержать только часть записей.

Приведение типов#

Так как CedrusData и PostgreSQL могут поддерживать типы данных, которые не поддерживаются другой стороной, коннектор PostgreSQL переопределяет некоторые типы данных при осуществлении операций чтения и записи.

Приведение типов PostgreSQL к типам CedrusData#

Коннектор PostgreSQL приводит типы PostgreSQL к типам CedrusData согласно таблице ниже.

Приведение типов PostgreSQL к типам CedrusData#

Тип PostgreSQL

Тип CedrusData

Комментарий

BIT

BOOLEAN

BOOLEAN

BOOLEAN

SMALLINT

SMALLINT

INTEGER

INTEGER

BIGINT

BIGINT

REAL

REAL

DOUBLE

DOUBLE

NUMERIC(p, s)

DECIMAL(p, s)

DECIMAL(p, s) является псевдонимом типа NUMERIC(p, s). См. Обработка DECIMAL типов.

CHAR(n)

CHAR(n)

VARCHAR(n)

VARCHAR(n)

ENUM

VARCHAR

BYTEA

VARBINARY

DATE

DATE

TIME(n)

TIME(n)

TIMESTAMP(n)

TIMESTAMP(n)

TIMESTAMPTZ(n)

TIMESTAMP(n) WITH TIME ZONE

MONEY

VARCHAR

UUID

UUID

JSON

JSON

JSONB

JSON

HSTORE

MAP(VARCHAR, VARCHAR)

ARRAY

Отключено, ARRAY, или JSON

См. Обработка ARRAY типов.

Другие типы данных не поддерживаются.

Приведение типов CedrusData к типам PostgreSQL#

Коннектор PostgreSQL приводит типы CedrusData к типам PostgreSQL согласно таблице ниже.

Приведение типов CedrusData к типам PostgreSQL#

Тип CedrusData

Тип PostgreSQL

Комментарий

BOOLEAN

BOOLEAN

SMALLINT

SMALLINT

TINYINT

SMALLINT

INTEGER

INTEGER

BIGINT

BIGINT

DOUBLE

DOUBLE

DECIMAL(p, s)

NUMERIC(p, s)

DECIMAL(p, s) является псевдонимом типа NUMERIC(p, s). См. Обработка DECIMAL типов.

CHAR(n)

CHAR(n)

VARCHAR(n)

VARCHAR(n)

VARBINARY

BYTEA

DATE

DATE

TIME(n)

TIME(n)

TIMESTAMP(n)

TIMESTAMP(n)

TIMESTAMP(n) WITH TIME ZONE

TIMESTAMPTZ(n)

UUID

UUID

JSON

JSONB

ARRAY

ARRAY

См. Обработка ARRAY типов.

Другие типы данных не поддерживаются.

Обработка DECIMAL типов#

Тип данных DECIMAL без явного указания precision ил scale сопоставляется с типом данных CedrusData DECIMAL с precision 38 и scale 0. Scale может быть изменен путем установки параметра конфигурации коннектора decimal-mapping или параметра сессии decimal_mapping в значение allow_overflow. В этом случае scale типа будет равен значению параметра конфигурации коннектора decimal-default-scale или параметра сессии decimal_default_scale. Precision всегда равен 38.

Если DECIMAL значение не умещается в заданные precision и scale без округления, CedrusData сгенерирует ошибку. Вы можете изменить данное поведение, разрешив автоматическое округление значение с помощью параметра конфигурации коннектора decimal-rounding-mode или параметра сессии decimal_rounding_mode. Допустимые значения: UNNECESSARY (the default), UP, DOWN, CEILING, FLOOR, HALF_UP, HALF_DOWN, HALF_EVEN. Данные значения соответствуют поведению RoundingMode в Java 17.

Обработка ARRAY типов#

Реализация ARRAY типов в PostgreSQL не поддерживает массивы фиксированной размерности, в то время как CedrusData поддерживает только одномерные массивы.

Вы можете сконфигурировать, каким образом PostgreSQL коннектор будет обрабатывать ARRAY типы с помощью параметра конфигурации коннектора postgresql.array-mapping или параметра сессии array_mapping:

  • DISABLED (значение по умолчанию): игнорировать колонки типа ARRAY.

  • AS_ARRAY: представлять массивы PostgreSQL как тип данных ARRAY в CedrusData. Данное значение подходит для массивов PostgreSQL, которые в фактически являются одномерными.

  • AS_JSON: представлять массивы PostgreSQL как тип данных JSON в CedrusData. Данное значение подходит для многомерных массивов PostgreSQL.

Конфигурация приведения типов#

Следующие параметры конфигурации могут быть использованы для изменения логики приведения типов.

Название

Описание

Значение по умолчанию

unsupported-type-handling

Как обрабатывать колонки неподдерживаемых типов: * IGNORE, не обрабатывать колонку. * CONVERT_TO_VARCHAR, привести значение колонки к VARCHAR неограниченной длины. Соответствующий параметр сессии: unsupported_type_handling.

IGNORE

jdbc-types-mapped-to-varchar

Список типов данных источника, которые должны быть принудительно приведены к VARCHAR неограниченной длины (даже если указанный тип поддерживается коннектором).

Работа с PostgreSQL#

PostgreSQL коннектор предоставляет каждую схему PostgreSQL в качестве отдельной схемы каталога CedrusData. Используйте команду SHOW SCHEMAS для получения списка схем каталога example:

SHOW SCHEMAS FROM example;

Если экземпляр PostgreSQL содержит схему web, вы можете получить список таблиц схемы с помощью команды SHOW TABLES:

SHOW TABLES FROM example.web;

Используйте команды DESCRIBE и SHOW COLUMNS для получения списка колонок таблицы:

DESCRIBE example.web.clicks;
SHOW COLUMNS FROM example.web.clicks;

Пример команды SELECT для получения данных из таблицы clicks схемы web:

SELECT * FROM example.web.clicks;

Поддержка SQL команд#

PostgreSQL коннектор поддерживает команды чтения и изменения данных и метаданных экземпляра PostgreSQL. В дополнение к общим командам и командам чтения коннектор поддерживает следующие операции:

SQL DELETE#

Команда DELETE с выражением WHERE работает только в случае, когда выполнение предиката может быть полностью делегировано источнику.

ALTER TABLE#

Коннектор поддерживает переименование таблиц только в пределах одной схемы.

Следующая команда поддерживается коннектором, так как переименовывает таблицу в пределах одной схемы.

ALTER TABLE example.schema_one.table_one RENAME TO example.schema_one.table_two

Следующая команда не поддерживается коннектором, так как меняет схему таблицы:

ALTER TABLE example.schema_one.table_one RENAME TO example.schema_two.table_two

ALTER SCHEMA#

Коннектор поддерживает переименование схемы с помощью команды ALTER SCHEMA RENAME. Команда ALTER SCHEMA SET AUTHORIZATION не поддерживается.

Табличные функции#

Коннектор предоставляет ряд табличных функций для обработки данных PostgreSQL.

query(varchar) -> table#

Табличная функция query позволяет запустить конкретный запрос к PostgreSQL с использованием нативного синтаксиса PostgreSQL. Запрос выполняется в PostgreSQL целиком без каких-либо изменений. Данный функционал может быть полезен, если вам требуется задействовать специфичный функционал PostgreSQL (например, нестандартный синтаксис или хинты или для ускорения запроса) или получить полный контроль над тем, какой запрос будет выполнен в PostgreSQL.

Примечание

Полиморфные табличные функции не всегда сохраняют оригинальный порядок записей в результате запроса. Есть табличная функция содержит запрос с ORDER BY, результат работы функции может вернуть записи в ином порядке. Для восстановления требуемого порядка используйте ORDER BY в запросе CedrusData.

Пример табличной функции query для сканирования таблицы tpch.nation:

SELECT
  *
FROM
  TABLE(
    example.system.query(
      query => 'SELECT
        *
      FROM
        tpch.nation'
    )
  );

Пример табличной функции query с использованием функционала PostgreSQL frame exclusion для оконных функций:

SELECT
  *
FROM
  TABLE(
    example.system.query(
      query => 'SELECT
        *,
        array_agg(week) OVER (
          ORDER BY
            week
          ROWS
            BETWEEN 2 PRECEDING
            AND 2 FOLLOWING
            EXCLUDE GROUP
        ) AS week,
        array_agg(week) OVER (
          ORDER BY
            day
          ROWS
            BETWEEN 2 PRECEDING
            AND 2 FOLLOWING
            EXCLUDE GROUP
        ) AS all
      FROM
        test.time_data'
    )
  );

Производительность#

PostgreSQL коннектор содержит набор оптимизаций производительности, приведенный в последующих секциях.

Статистики таблиц#

PostgreSQL коннектор может использовать статистики колонок и таблиц для cost-based оптимизации запросов.

Сбор статистик осуществляет экземпляр PostgreSQL, после чего передает их CedrusData. Используйте команду ANALYZE для сбора статистик таблиц.

ANALYZE table_schema.table_name;

Pushdown#

Коннектор поддерживает pushdown следующих операций:

Коннектор поддерживает pushdown агрегатных функций:

Join pushdown#

Коннектор поддерживает Join pushdown в режимах AUTOMATIC (значение по умолчанию) и EAGER.

В режиме AUTOMATIC коннектор принимает решение о join pushdown на основе предполагаемой стоимости запроса с и без join pushdown. Join pushdown происходит только тогда, когда доступные Статистики оптимизатора позволяют предположить, что join pushdown приведет к улучшению производительности. Если статистики задействованных таблиц и колонок недоступны, join pushdown не будет произведен, что бы избежать потенциального ухудшения производительности.

В режиме EAGER join pushdown происходит всегда, когда это допустимо коннектором с точки зрения корректности, даже если соответствующие статистики недоступны. По этой причине использование режима EAGER рекомендовано только для тестирования и отладки.

Таблица ниже содержит параметры конфигурации, относящиеся к cost-based join pushdown:

Название

Описание

Значение по умолчанию

join-pushdown.enabled

Разрешать join pushdown или нет. Соответствующий параметр сессии: join_pushdown_enabled.

true

join-pushdown.strategy

Стратегия принятия решения о join pushdown. Допустимые значения: AUTOMATIC, EAGER.

AUTOMATIC

Примечание

Коннектор осуществляет pushdown для улучшения производительности запросов. Вместо с тем, коннектор не будет делать pushdown конкретной операции, если это может привести к некорректным результатам. Таким образом коннектор предпочитает корректность производительности. В некоторых случаях коннекторы могут предоставлять дополнительные параметры конфигурации, которые разрешают pushdown небезопасных операций, но только при явном указании соответствующего параметра пользователем.

Поддержка predicate pushdown#

Коннектор поддерживает pushdown предикатов для большинства типов данных, включая UUID и временные типы, такие как DATE.

По умолчанию коннектор не поддерживает pushdown range-предикатов (например, >, <, BETWEEN) к строковым колонкам, таких как CHAR или VARCHAR. Данное ограничение необходимо для обеспечения корректности результатов запросов, так как экземпляр PostgreSQL может сравнивать строковые значения иначе в зависимости от конфигурации. Предикаты равенства и неравенства к строковым колонкам поддерживаются.

-- Pushdown не поддерживается
SELECT * FROM nation WHERE name > 'CANADA';
-- Pushdown поддерживается
SELECT * FROM nation WHERE name != 'CANADA';
SELECT * FROM nation WHERE name = 'CANADA';

Вы можете явно разрешить pushdown range-предикатов к строковым колонкам с помощью параметра конфигурации каталога postgresql.experimental.enable-string-pushdown-with-collate или параметра сессии enable_string_pushdown_with_collate:

postgresql.experimental.enable-string-pushdown-with-collate=true
SET SESSION example.enable_string_pushdown_with_collate=true

Используйте данный функционал когда вы уверены, что корректность результатов не пострадает.