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. Допустимые значения: |
|
Имя пользователя для подключения к источнику. Используется при |
|
Пароль для подключения к источнику. Используется при |
|
Путь к properties файлу, содержащему параметры |
|
Путь к keystore файлу, из которого следует прочитать имя пользователя и пароль. Используется при
|
|
Тип keystore файла. Например, |
|
Пароль к keystore файлу. |
|
Имя keystore entity, содержащей имя пользователя для подключения к источнику. |
|
Пароль к keystore entity, содержащей имя пользователя для подключения к источнику |
|
Имя keystore entity, содержащей пароль для подключения к источнику. |
|
Пароль к keystore entity, содержащей пароль для подключения к источнику. |
|
Имя параметра extra credentials, значение которого следует использовать в качестве имени пользователя.
См. |
|
Имя параметра extra credentials, значение которого следует использовать в качестве пароля.
См. |
Несколько серверов PostgreSQL#
PostgreSQL коннектор может работать только с одним экземпляром PostgreSQL. Если у вас есть несколько экземпляров PostgreSQL вам следует сконфигурировать несколько каталогов PostgreSQL коннектора, каждый из которых будет работать с конкретным экземпляром PostgreSQL.
Общие параметры конфигурации#
Общие параметры конфигурации каталога приведены в таблице ниже:
Название |
Описание |
Значение по умолчанию |
---|---|---|
|
Включить поддержку case insensitive идентификаторов. |
|
|
Время жизни закэшированных метаданных о case insensitive идентификаторах. |
|
|
Путь к файлу конфигурации в формате JSON, который позволяет разрешать конфликты имен между case insensitive схемами и таблицами. |
|
|
Частота проверки обновлений файла |
|
|
Время жизни закэшированных метаданных. Положительное значение включает кэширование. |
|
|
Кэшировать ли информацию о том, что для используемых таблиц и колонок отсутствуют статистики. Включение данного
параметра может ускорить планирование некоторых запросов. Однако, если информация об отсутствии статистик для
конкретного объекта СУБД закэширована, но статистики стали доступны позднее (например, была запущена
команда |
|
|
Максимальное количество объектов, хранящихся в metadata cache. |
|
|
Максимальное количество команд в batch операциях записи данных. Изменение данного параметра не рекомендовано, так как оно может негативно сказаться на производительности. |
|
|
Использовать ли динамические фильтры при работе с JDBC источником. |
|
|
Максимальное время ожидания готовности динамических фильтров с build стороны оператора join перед запуском JDBC запроса к источнику. Увеличение таймаута может позволить CedrusData выполнить запрос к источнику с более селективными фильтрами, но в то же время может увеличить latency некоторых запросов. |
|
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 |
Комментарий |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Отключено, |
Другие типы данных не поддерживаются.
Приведение типов CedrusData к типам PostgreSQL#
Коннектор PostgreSQL приводит типы CedrusData к типам PostgreSQL согласно таблице ниже.
Тип CedrusData |
Тип PostgreSQL |
Комментарий |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Другие типы данных не поддерживаются.
Обработка 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.
Конфигурация приведения типов#
Следующие параметры конфигурации могут быть использованы для изменения логики приведения типов.
Название |
Описание |
Значение по умолчанию |
---|---|---|
|
Как обрабатывать колонки неподдерживаемых типов:
* |
|
|
Список типов данных источника, которые должны быть принудительно приведены к |
Работа с 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 или нет. Соответствующий параметр сессии: |
|
|
Стратегия принятия решения о join pushdown. Допустимые значения: |
|
Примечание
Коннектор осуществляет 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
Используйте данный функционал когда вы уверены, что корректность результатов не пострадает.