PostgreSQL 커넥터
PostgreSQL 커넥터 (PostgreSQL connector)
PostgreSQL 커넥터는 Trino 쿼리에서 외부 PostgreSQL 데이터베이스의 데이터를 조회하고 테이블을 만들 수 있게 해줍니다. 커넥터를 활용하면 PostgreSQL과 Hive처럼 서로 다른 시스템, 또는 여러 PostgreSQL 인스턴스의 데이터를 조인할 수 있어요.
출처: 문서
본문
요구 사항 (Requirements)
PostgreSQL에 연결하려면 다음이 필요합니다:
- PostgreSQL 12.x 이상.
- Trino 코디네이터와 워커에서 PostgreSQL로의 네트워크 접근. 기본 포트는 5432.
설정 (Configuration)
PostgreSQL 서버의 데이터베이스를 조회할 수 있습니다. connector.name을 postgresql로 설정해 PostgreSQL 커넥터를 지정하는 카탈로그 속성 파일을 만드세요.
예를 들어 데이터베이스에 example 카탈로그로 접근하려면 etc/catalog/example.properties 파일을 만들고, 자신의 설정에 맞게 연결 속성을 바꿔주세요:
connector.name=postgresql
connection-url=jdbc:postgresql://example.net:5432/database
connection-user=root
connection-password=secret
connection-url은 PostgreSQL JDBC 드라이버에 전달할 연결 정보와 파라미터를 정의합니다. URL의 파라미터는 PostgreSQL JDBC 드라이버 문서에서 확인할 수 있습니다. 일부 파라미터는 커넥터 동작에 부정적 영향을 주거나 커넥터와 함께 동작하지 않을 수 있습니다.
connection-user와 connection-password는 일반적으로 필수이며 연결 자격 증명(보통 서비스 사용자)을 결정합니다. 시크릿 (secrets)을 사용하면 카탈로그 속성 파일에 실제 값을 넣지 않고도 관리할 수 있습니다.
시스템 테이블 접근 (Access to system tables)
PostgreSQL 커넥터는 pg_namespace 같은 PostgreSQL 카탈로그 테이블 읽기를 지원합니다. 이 기능은 기본적으로 꺼져 있으며 postgresql.include-system-tables 설정 속성으로 활성화할 수 있습니다.
example 카탈로그의 pg_catalog 스키마에서 자세한 내용을 볼 수 있습니다. 예를 들어 pg_namespace 시스템 테이블:
SHOW TABLES FROM example.pg_catalog;
SELECT * FROM example.pg_catalog.pg_namespace;
연결 보안 (Connection security)
데이터 소스에 전역 신뢰 인증서가 설치된 TLS가 설정되어 있다면 connection-url 카탈로그 설정 속성에 파라미터를 덧붙여 클러스터와 데이터 소스 사이의 TLS를 활성화할 수 있습니다.
예를 들어 PostgreSQL JDBC 드라이버 42 버전에서는 connection-url 설정 속성에 ssl=true 파라미터를 덧붙여 TLS를 활성화합니다:
connection-url=jdbc:postgresql://example.net:5432/database?ssl=true
데이터 소스 인증 (Data source authentication)
커넥터는 데이터 소스 연결용 자격 증명을 여러 방법으로 제공할 수 있습니다:
- 커넥터 설정 파일에 inline으로
- 별도의 properties 파일로
- 키 스토어 파일로
- Trino에 연결할 때 추가 자격 증명 (extra credentials)으로
시크릿 (secrets)을 활용하면 카탈로그 속성 파일에 민감한 값을 저장하지 않을 수 있어요.
| 속성 이름 | 설명 |
|---|---|
credential-provider.type |
자격 증명 공급자 유형. INLINE, FILE, KEYSTORE 중 하나여야 하며 기본값은 INLINE. |
connection-user |
연결 사용자 이름. |
connection-password |
연결 비밀번호. |
user-credential-name |
사용자 이름으로 사용할 추가 자격 증명 속성 이름. |
password-credential-name |
비밀번호로 사용할 추가 자격 증명 속성 이름. |
connection-credential-file |
자격 증명이 있는 properties 파일 위치. connection-user와 connection-password 속성을 포함해야 합니다. |
keystore-file-path |
자격 증명을 읽을 Java Keystore 파일 위치. |
keystore-type |
키 스토어 파일 형식(예: JKS 또는 PEM). |
keystore-password |
키 스토어 비밀번호. |
keystore-user-credential-name |
사용자 이름으로 사용할 키 스토어 엔티티 이름. |
keystore-user-credential-password |
사용자 이름 키 스토어 엔티티의 비밀번호. |
keystore-password-credential-name |
비밀번호로 사용할 키 스토어 엔티티 이름. |
keystore-password-credential-password |
비밀번호 키 스토어 엔티티의 비밀번호. |
여러 PostgreSQL 데이터베이스 또는 서버 (Multiple PostgreSQL databases or servers)
PostgreSQL 커넥터는 PostgreSQL 서버 안의 단일 데이터베이스에만 접근할 수 있습니다. 따라서 여러 PostgreSQL 데이터베이스나 여러 서버에 연결하려면 PostgreSQL 커넥터를 여러 개 설정해야 합니다.
다른 카탈로그를 추가하려면 etc/catalog에 다른 이름의 properties 파일을 추가하면 됩니다. 예를 들어 sales.properties라는 파일을 만들면 Trino가 sales라는 카탈로그를 생성합니다.
일반 설정 속성 (General configuration properties)
| 속성 이름 | 설명 | 기본값 |
|---|---|---|
case-insensitive-name-matching |
대소문자 구분 없는 스키마/테이블 이름 지원 여부. | false |
case-insensitive-name-matching.cache-ttl |
대소문자 구분 없는 이름이 캐시되는 기간. | 1m |
case-insensitive-name-matching.config-file |
이름 매핑 설정 파일(JSON) 경로. | null |
case-insensitive-name-matching.config-file.refresh-period |
이름 매핑 파일 변경 확인 주기. | 0s |
metadata.cache-ttl |
테이블/컬럼 통계를 포함한 메타데이터 캐시 기간. | 0s |
metadata.cache-missing |
메타데이터가 없음을 캐시할지 여부. | false |
metadata.schemas.cache-ttl |
스키마 메타데이터 캐시 기간. | metadata.cache-ttl 값 |
metadata.tables.cache-ttl |
테이블 메타데이터 캐시 기간. | metadata.cache-ttl 값 |
metadata.statistics.cache-ttl |
테이블 통계 캐시 기간. | metadata.cache-ttl 값 |
metadata.cache-maximum-size |
메타데이터 캐시에 저장되는 최대 객체 수. | 10000 |
write.batch-size |
배치 실행에서의 최대 명령문 수. 기본값에서 바꾸지 마세요. | 1000 |
dynamic-filtering.enabled |
동적 필터를 JDBC 쿼리로 푸시다운. | true |
dynamic-filtering.wait-timeout |
JDBC 쿼리 시작 전에 조인의 빌드 측에서 동적 필터가 모이기를 기다리는 최대 시간. 큰 타임아웃은 더 상세한 동적 필터를 만들 수 있지만 일부 쿼리 대기 시간을 늘릴 수 있습니다. | 20s |
쿼리 메타데이터 추가 (Appending query metadata)
query.comment-format 선택 파라미터로 각 쿼리와 함께 데이터 소스에 전송되는 SQL 주석을 설정할 수 있습니다. 이 주석의 형식은 어떤 문자든 포함할 수 있으며 다음 메타데이터를 지원합니다:
$QUERY_ID: 쿼리 식별자.$USER: 쿼리를 Trino에 제출한 사용자 이름.$SOURCE: 쿼리를 제출하는 데 사용된 클라이언트 도구 식별자 (예:trino-cli).$TRACE_TOKEN: 클라이언트 도구로 설정된 추적 토큰.
주석은 쿼리에 더 많은 맥락을 제공할 수 있으며, 이 정보는 데이터 소스의 로그에서 확인할 수 있습니다. Trino 클러스터의 환경 변수를 주석에 포함하려면 ${ENV:VARIABLE-NAME} 문법을 사용하세요.
다음 예제는 Trino가 보내는 각 쿼리를 식별하는 간단한 주석을 설정합니다:
query.comment-format=Query sent by Trino.
이 설정에서 SELECT * FROM example_table; 같은 쿼리는 주석이 덧붙여져 데이터 소스로 전송됩니다:
SELECT * FROM example_table; /*Query sent by Trino.*/
다음 예제는 메타데이터를 사용해 앞선 예제를 개선합니다:
query.comment-format=Query $QUERY_ID sent by user $USER from Trino.
Jane이 쿼리 식별자 20230622_180528_00000_bkizg로 쿼리를 보냈다면 다음 주석 문자열이 데이터 소스로 전송됩니다:
SELECT * FROM example_table; /*Query 20230622_180528_00000_bkizg sent by user Jane from Trino.*/
일부 JDBC 드라이버 설정과 로깅 구성은 주석이 제거되게 할 수 있습니다.
도메인 압축 임계값 (Domain compaction threshold)
큰 조건 목록을 데이터 소스로 푸시다운하면 성능이 저하될 수 있습니다. Trino는 기본적으로 큰 조건을 더 단순한 범위 조건으로 압축해 성능과 조건 푸시다운 사이의 균형을 맞춥니다. domain-compaction-threshold 카탈로그 설정 속성 또는 domain_compaction_threshold 카탈로그 세션 속성으로 이 임계값의 기본값인 256을 조정할 수 있습니다.
대소문자 구분 없는 매칭 (Case insensitive matching)
case-insensitive-name-matching을 true로 설정하면 Trino는 소문자 이름을 원격 시스템의 실제 이름에 매핑해 비소문자 스키마와 테이블을 조회할 수 있습니다. 다만 이름이 대소문자만 다른 두 스키마/테이블("customers"와 "Customers")이 있으면 모호성 때문에 조회가 실패합니다.
이런 경우 case-insensitive-name-matching.config-file 카탈로그 설정 속성으로 원격 스키마/테이블을 각각의 Trino 스키마/테이블에 매핑하는 설정 파일을 지정하세요. JSON 파일은 빈 배열이라도 schemas와 tables 속성을 모두 포함해야 합니다.
{
"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"
}]
}
mapping 속성에 정의된 테이블/스키마 중 하나를 대상으로 한 쿼리는 해당 원격 엔티티에 대해 실행됩니다. 매핑 설정 파일이 변경되면 기본적으로 Trino를 재시작해야 변경 사항이 로드됩니다. case-insensitive-name-matching.config-file.refresh-period를 설정하면 재시작 없이 속성을 갱신할 수 있습니다:
case-insensitive-name-matching.config-file.refresh-period=30s
장애 허용 실행 지원 (Fault-tolerant execution support)
커넥터는 쿼리 처리의 장애 허용 실행을 지원합니다. 어떤 재시도 정책으로든 읽기와 쓰기 연산 모두 지원됩니다.
데이터 유형 매핑 (Type mapping)
Trino와 PostgreSQL은 서로 지원하지 않는 유형이 있으므로, 이 커넥터는 데이터를 읽거나 쓸 때 일부 유형을 변환합니다. 각 방향의 매핑은 아래 표를 참고하세요.
PostgreSQL 유형에서 Trino 유형으로의 매핑:
| PostgreSQL 유형 | Trino 유형 | 비고 |
|---|---|---|
BIT |
BOOLEAN |
|
BOOLEAN |
BOOLEAN |
|
SMALLINT |
SMALLINT |
|
INTEGER |
INTEGER |
|
BIGINT |
BIGINT |
|
REAL |
REAL |
|
DOUBLE |
DOUBLE |
|
NUMERIC(p, s) / DECIMAL(p, s) |
DECIMAL(pʹ, sʹ) 또는 NUMBER |
입력 데이터를 손실 없이 Trino DECIMAL로 표현할 수 있으면 DECIMAL로 매핑. 1 ≤ p ≤ 38이고 0 ≤ s ≤ p이면 pʹ = p, sʹ = s, 아니면 더 넓은 유형 사용. 그렇지 않으면 NUMBER로 매핑. |
NUMERIC / DECIMAL |
NUMBER |
|
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 |
|
VECTOR |
ARRAY(REAL) |
|
HSTORE |
MAP(VARCHAR, VARCHAR) |
|
ARRAY |
비활성화, ARRAY, 또는 JSON |
배열 유형 처리 참고 |
GEOMETRY, GEOMETRY(GEOMETRY TYPE, SRID), POINT |
GEOMETRY |
그 외 유형은 지원되지 않습니다.
Trino 유형에서 PostgreSQL 유형으로의 매핑:
| Trino 유형 | PostgreSQL 유형 | 비고 |
|---|---|---|
BOOLEAN |
BOOLEAN |
|
SMALLINT |
SMALLINT |
|
TINYINT |
SMALLINT |
|
INTEGER |
INTEGER |
|
BIGINT |
BIGINT |
|
DOUBLE |
DOUBLE |
|
DECIMAL(p, s) |
NUMERIC(p, s) |
|
NUMBER |
NUMERIC |
|
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 |
배열 유형 처리 참고 |
GEOMETRY |
GEOMETRY |
그 외 유형은 지원되지 않습니다.
배열 유형 처리 (Array type handling)
PostgreSQL의 배열 구현은 고정 차원을 지원하지 않는 반면 Trino는 고정 차원 배열만 지원합니다. postgresql.array-mapping 카탈로그 설정 속성 또는 array_mapping 세션 속성으로 커넥터가 배열을 처리하는 방식을 설정할 수 있습니다. 허용되는 값:
DISABLED(기본값): 배열 컬럼을 건너뜁니다.AS_ARRAY: 고정 차원 배열 컬럼을 TrinoARRAY유형으로 해석합니다.AS_JSON: 차원 제약 없이 배열 컬럼을 TrinoJSON유형으로 해석합니다.
유형 매핑 설정 속성 (Type mapping configuration properties)
| 속성 이름 | 설명 | 기본값 |
|---|---|---|
unsupported-type-handling |
지원되지 않는 컬럼 유형 처리 방식: IGNORE(컬럼 접근 불가) 또는 CONVERT_TO_VARCHAR(무제한 VARCHAR로 변환). 해당 카탈로그 세션 속성은 unsupported_type_handling. |
IGNORE |
jdbc-types-mapped-to-varchar |
무제한 VARCHAR로 변환할 유형의 쉼표 구분 목록을 강제 매핑. |
— |
PostgreSQL 조회 (Querying PostgreSQL)
PostgreSQL 커넥터는 각 PostgreSQL 스키마에 대해 스키마를 제공합니다. SHOW SCHEMAS로 사용 가능한 PostgreSQL 스키마를 확인할 수 있습니다:
SHOW SCHEMAS FROM example;
web이라는 PostgreSQL 스키마가 있으면 SHOW TABLES로 이 스키마의 테이블을 볼 수 있습니다:
SHOW TABLES FROM example.web;
web 스키마의 clicks 테이블 컬럼 목록은 다음 중 하나로 확인할 수 있습니다:
DESCRIBE example.web.clicks;
SHOW COLUMNS FROM example.web.clicks;
마지막으로 web 스키마의 clicks 테이블에 접근할 수 있습니다:
SELECT * FROM example.web.clicks;
SQL 지원 (SQL support)
커넥터는 PostgreSQL의 데이터와 메타데이터에 대해 읽기/쓰기 접근을 제공합니다. 전역 사용 가능 명령문과 읽기 연산 명령문에 더해 다음 기능을 지원합니다:
- INSERT — 비트랜잭션 INSERT 참고
- UPDATE — UPDATE 제한 참고
- DELETE — DELETE 제한 참고
- MERGE — 비트랜잭션 MERGE 참고
- TRUNCATE
- 스키마/테이블 관리 — ALTER TABLE RENAME TO 제한, ALTER SCHEMA 제한 참고
- 프로시저
- 테이블 함수
비트랜잭션 INSERT (Non-transactional INSERT)
커넥터는 INSERT 문으로 행 추가를 지원합니다. 기본적으로 데이터는 임시 테이블에 먼저 기록됩니다. insert.non-transactional-insert.enabled 카탈로그 속성 또는 해당 non_transactional_insert 카탈로그 세션 속성을 true로 설정하면 이 단계를 건너뛰고 대상 테이블에 직접 기록해 성능을 높일 수 있습니다.
이 속성을 켜면 드물게 insert 작업 중 예외가 발생할 때 데이터가 손상될 수 있습니다. 트랜잭션이 비활성화되므로 롤백이 불가능합니다.
UPDATE 제한 (UPDATE limitation)
상수 할당과 상수 조건을 가진 UPDATE 문만 지원합니다. 예를 들어:
UPDATE table SET col1 = 1 WHERE col3 = 1
산술 표현식, 함수 호출 등 비상수 UPDATE 문은 지원되지 않습니다. 예를 들어:
UPDATE table SET col1 = col2 + 2 WHERE col3 = 1
한 행의 모든 컬럼 값을 동시에 갱신할 수는 없습니다:
UPDATE table SET col1 = 1, col2 = 2, col3 = 3 WHERE col3 = 1
DELETE 제한 (DELETE limitation)
WHERE 절이 지정되면 해당 절의 조건을 데이터 소스에 완전히 푸시다운할 수 있을 때만 DELETE가 동작합니다.
비트랜잭션 MERGE (Non-transactional MERGE)
merge.non-transactional-merge.enabled 카탈로그 속성 또는 non_transactional_merge_enabled 카탈로그 세션 속성이 true이면 MERGE 문으로 행 추가/갱신/삭제를 지원합니다. MERGE는 대상 테이블을 직접 수정할 때만 지원됩니다.
드물게 merge 작업 중 예외가 발생해 부분 갱신이 일어날 수 있습니다.
ALTER TABLE RENAME TO 제한 (ALTER TABLE RENAME TO limitation)
여러 스키마에 걸친 테이블 이름 변경은 지원하지 않습니다:
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 limitation)
커넥터는 ALTER SCHEMA RENAME 문으로 스키마 이름 변경을 지원합니다. ALTER SCHEMA SET AUTHORIZATION은 지원되지 않습니다.
프로시저 (Procedures)
system.flush_metadata_cache()
JDBC 메타데이터 캐시를 비웁니다:
USE example.example_schema;
CALL system.flush_metadata_cache();
system.execute('query')
execute 프로시저는 연결된 데이터 소스에서 쿼리를 직접 실행하게 해줍니다. 쿼리는 연결된 데이터 소스의 지원 문법을 사용해야 합니다. Trino에 없는 기능에 접근하거나, 결과 집합을 반환하지 않아 query나 raw_query 패스스루 테이블 함수로 사용할 수 없는 쿼리를 실행할 때 유용합니다.
쿼리 텍스트는 Trino가 파싱하지 않고 그대로 전달하므로, 연결된 데이터 소스의 보안/접근 제어만 적용됩니다.
USE example.example_schema;
CALL system.execute(query => 'ALTER TABLE your_table ALTER COLUMN your_column DROP DEFAULT');
테이블 함수 (Table functions)
커넥터는 PostgreSQL에 접근하기 위한 특정 테이블 함수를 제공합니다.
query(varchar) -> table
query 함수는 연결된 데이터베이스를 직접 조회하게 해줍니다. 전체 쿼리가 푸시다운되어 PostgreSQL에서 처리되므로 PostgreSQL 고유 문법이 필요합니다.
연결된 데이터 소스에 전달되는 네이티브 쿼리는 결과 집합으로 테이블을 반환해야 합니다. 검증과 보안 검사는 오직 데이터 소스가 자체 설정으로 수행합니다. 패스스루 쿼리는 데이터 읽기에만 사용하세요.
간단한 예로, example 카탈로그를 조회해 전체 테이블을 선택합니다:
SELECT
*
FROM
TABLE(
example.system.query(
query => 'SELECT
*
FROM
tpch.nation'
)
);
실용적인 예로, 윈도우 함수 사용 시 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'
)
);
쿼리 엔진은 이 함수의 결과 순서를 보존하지 않습니다. 전달한 쿼리에 ORDER BY 절이 있으면 함수 결과 순서가 예상과 다를 수 있습니다.
성능 (Performance)
커넥터는 다음 섹션에 설명된 여러 성능 개선을 포함합니다.
테이블 통계 (Table statistics)
PostgreSQL 커넥터는 비용 기반 최적화를 위해 테이블/컬럼 통계를 사용해 실제 데이터에 기반한 쿼리 처리 성능을 높일 수 있습니다.
통계는 PostgreSQL이 수집하고 커넥터가 가져옵니다. 테이블 통계를 수집하려면 PostgreSQL에서 다음 문을 실행하세요:
ANALYZE table_schema.table_name;
추가 ANALYZE 옵션은 PostgreSQL 문서를 참고하세요.
푸시다운 (Pushdown)
커넥터는 다음 연산에 대해 푸시다운을 지원합니다:
- 조인 푸시다운
- LIMIT 푸시다운
- Top-N 푸시다운
- 다음 함수에 대한 집계 푸시다운:
avg(),count(),max(),min(),sum(),stddev(),stddev_pop(),stddev_samp(),variance(),var_pop(),var_samp(),covar_pop(),covar_samp(),corr(),regr_intercept(),regr_slope()
커넥터는 성능이 향상될 수 있는 곳에서 푸시다운을 수행하지만, 정확성을 지키기 위해 일부 연산은 푸시다운되지 않을 수 있습니다.
비용 기반 조인 푸시다운 (Cost-based join pushdown)
커넥터는 조인 연산을 데이터 소스로 푸시다운할지 여부를 지능적으로 결정하는 비용 기반 조인 푸시다운을 지원합니다. 활성화되면 사용 가능한 테이블 통계가 성능을 개선한다고 시사할 때만 조인 연산을 푸시다운합니다.
| 속성 이름 | 설명 | 기본값 |
|---|---|---|
join-pushdown.enabled |
조인 푸시다운 활성화. 해당 카탈로그 세션 속성은 join_pushdown_enabled. |
true |
join-pushdown.strategy |
조인 푸시다운 여부를 평가하는 전략. AUTOMATIC이면 비용 기반 조인 푸시다운, EAGER이면 가능할 때마다 조인 푸시다운. EAGER는 테이블 통계가 없어도 푸시다운하므로 쿼리 성능 저하가 생길 수 있어 테스트/트러블슈팅 용도로만 권장. |
AUTOMATIC |
조건 푸시다운 지원 (Predicate pushdown support)
대부분의 유형에 대해 조건이 푸시다운됩니다. 여기에는 UUID와 DATE 같은 시간 유형이 포함됩니다.
커넥터는 > 같은 범위 조건에 대해서는 푸시다운을 지원하지 않습니다 (예: name > 'CANADA'). 문자 문자열 유형에서만 해당 문제가 발생합니다. 다음 예제에서 같은 name 컬럼에 대해 > 비교는 푸시다운되지 않지만 !=, = 비교는 푸시다운됩니다:
-- 푸시다운되지 않음
SELECT * FROM nation WHERE name > 'CANADA';
-- 푸시다운됨
SELECT * FROM nation WHERE name != 'CANADA';
SELECT * FROM nation WHERE name = 'CANADA';
postgresql.experimental.enable-string-pushdown-with-collate 카탈로그 설정 속성 또는 enable_string_pushdown_with_collate 세션 속성을 true로 설정하면 문자 문자열 유형 컬럼의 범위 조건 푸시다운을 활성화하는 실험적 지원이 있습니다. 이 설정을 켜면 위 예제의 모든 쿼리 조건이 푸시다운됩니다.
더 알아보기 (Learn more)
PostgreSQL 커넥터로 다른 데이터 소스와 데이터를 조합해보세요. 커넥터의 일반적인 개념은 커넥터 개요 문서에서 확인할 수 있어요.