설명
시작하기
사용법
버전 관리 정책
- API가 변경되면 메이저 버전이 증가합니다
- 하위 호환되는 SQL이 변경되면 마이너 버전이 증가합니다
- 바이너리에만 변경이 있으면 패치 버전이 증가합니다
- 라이브러리 버전(PostgreSQL 18 이상에서는
PG_MODULE_MAGIC으로 정의됨)에는 전체 시맨틱 버전이 포함되며,pgch_version()함수의 출력 또는 Postgrespg_get_loaded_modules()함수에서 확인할 수 있습니다. - 확장 기능 버전(control file에 정의됨)에는 메이저 버전과 마이너 버전만 포함되며,
pg_catalog.pg_extension테이블,pg_available_extension_versions()함수의 출력, 그리고\dx pg_clickhouse에서 확인할 수 있습니다.
v0.1.0에서 v0.1.1로 변경되는 경우, v0.1을 로드한 모든 데이터베이스가
별도로 ALTER EXTENSION을 실행하지 않아도 업그레이드의 이점을 누릴 수 있음을 의미합니다.
반면 마이너 버전 또는 메이저 버전이 증가하는 릴리스에는
SQL 업그레이드 스크립트가 함께 제공되며, 확장 기능이 포함된 기존의 모든 데이터베이스는
업그레이드의 이점을 얻으려면 ALTER EXTENSION pg_clickhouse UPDATE를 실행해야
합니다.
DDL SQL 참고
CREATE EXTENSION
WITH SCHEMA를 사용하십시오(권장):
ALTER EXTENSION
-
새 pg_clickhouse release를 설치한 후
UPDATE절을 사용하십시오: -
확장 기능을 새 스키마로 이동하려면
SET SCHEMA를 사용하십시오:
DROP EXTENSION
CASCADE 절을 사용하십시오:
CREATE SERVER
driver: 사용할 ClickHouse 연결 드라이버입니다. “binary” 또는 “http” 중 하나입니다. 필수입니다.dbname: 연결할 때 사용할 ClickHouse 데이터베이스입니다. 기본값은 “default”입니다.fetch_size: HTTP 스트리밍에 사용할 대략적인 바이트 단위 배치 크기입니다. 배치는 행 경계에서 분할됩니다. 기본값은50000000(50 MB)입니다.0으로 설정하면 스트리밍이 비활성화되고 전체 응답을 버퍼링합니다. 외부 테이블은 이 값을 재정의할 수 있습니다.host: ClickHouse 서버의 호스트 이름입니다. 기본값은 “localhost”입니다.port: ClickHouse 서버에 연결할 포트입니다. 기본값은 다음과 같습니다.driver가 “binary”이고host가 ClickHouse Cloud 호스트인 경우 9440driver가 “binary”이고host가 ClickHouse Cloud 호스트가 아닌 경우 9004driver가 “http”이고host가 ClickHouse Cloud 호스트인 경우 8443driver가 “http”이고host가 ClickHouse Cloud 호스트가 아닌 경우 8123
ALTER SERVER
DROP SERVER
CASCADE를 사용하십시오:
CREATE USER MAPPING
taxi_srv 외부 서버로 연결할 때 현재 PostgreSQL 사용자를 원격 ClickHouse 사용자에 매핑하려면
다음을 사용하십시오:
user: ClickHouse 사용자 이름입니다. 기본값은 “default”입니다.password: ClickHouse 사용자 비밀번호입니다.
ALTER USER MAPPING
DROP USER MAPPING
IMPORT FOREIGN SCHEMA
LIMIT TO를 사용하여 가져오기 대상을 특정 테이블로 제한합니다:
EXCEPT를 사용합니다:
CREATE FOREIGN TABLE
database: 원격 데이터베이스의 이름입니다. 기본값은 외부 서버에 정의된 데이터베이스입니다.fetch_size: HTTP streaming의 대략적인 배치 크기(바이트 단위)입니다. 서버 수준의fetch_size를 재정의합니다. 기본값은50000000(50 MB)입니다.0은 streaming을 비활성화하고 전체 응답을 버퍼링합니다.table_name: 원격 테이블의 이름입니다. 기본값은 외부 테이블에 지정된 이름입니다.engine: ClickHouse 테이블에서 사용하는 [테이블 엔진]입니다.CollapsingMergeTree()및AggregatingMergeTree()의 경우, pg_clickhouse는 테이블에서 실행되는 함수 표현식에 매개변수를 자동으로 적용합니다.
-
column_name: ClickHouse 쪽의 컬럼 이름으로, 쿼리와 삽입을 디파싱할 때 PostgreSQL 속성 이름보다 우선해서 사용됩니다. 따옴표 없이 사용하는 소문자 PostgreSQL 컬럼 이름을 대소문자를 구분하는 ClickHouse 컬럼에 매핑할 때 유용합니다. 예를 들면 다음과 같습니다. -
AggregateFunction: AggregateFunction Type 컬럼에 적용되는 집계 함수의 이름입니다. 데이터 타입을 함수에 전달되는 ClickHouse 타입에 매핑하고, 적절한 컬럼 옵션으로 집계 함수 이름을 지정하면 pg_clickhouse가 해당 컬럼을 평가하는 집계 함수에Merge를 자동으로 추가합니다. -
SimpleAggregateFunction: SimpleAggregateFunction Type 컬럼에 적용되는 집계 함수의 이름입니다. 데이터 타입을 함수에 전달되는 ClickHouse 타입에 매핑하고 적절한 컬럼 옵션으로 집계 함수 이름을 지정하십시오.
ALTER FOREIGN TABLE
DROP FOREIGN TABLE
CASCADE 절을 사용하십시오:
DML SQL 참고
EXPLAIN
VERBOSE 옵션을 사용하면
ClickHouse “Remote SQL” 쿼리가 출력됩니다:
SELECT
nodes 테이블의 로컬 복사본을 만들어 이를 JOIN합니다:
node_id를 기준으로 그룹화한 다음, 나중에 lookup 테이블을 조인하여 더 많은 집계 처리를 ClickHouse에서 수행할 수 있습니다:
node_id 기준으로 집계를 푸시다운하여, Postgres로 다시 가져와야 하는
행 수를 1000개(전체 행)에서 각 노드당 1개씩, 총 8개로
줄입니다.
PREPARE, EXECUTE, DEALLOCATE
{param:type} 형식의 [쿼리 매개변수]를 전송합니다:
매개변수:
INSERT
COPY
⚠️ Batch API 제한 사항 pg_clickhouse는 아직 PostgreSQL FDW의 Batch 삽입 API를 지원하지 않습니다. 따라서 현재 COPY는 레코드 삽입에 INSERT SQL 문을 사용합니다. 이 부분은 향후 릴리스에서 개선될 예정입니다.
LOAD
SET
pg_clickhouse.session_settings
pg_clickhouse.session_settings 매개변수는 이후 쿼리에 적용할 [ClickHouse
설정]을 구성합니다. 예시:
join_use_nulls 1, group_by_use_nulls 1, final 1입니다. ClickHouse 서버 설정을 사용하려면
빈 문자열로 설정하십시오.
date_time_output_format: HTTP 드라이버는 이 값을 “iso”로 요구합니다format_tsv_null_representation: HTTP 드라이버는 기본값을 요구합니다output_format_tsv_crlf_end_of_lineHTTP 드라이버는 기본값을 요구합니다
pg_clickhouse.session_settings를 설정하기 전에
pg_clickhouse를 먼저 로드해야 합니다. [공유 라이브러리 사전 로드]를 사용하거나,
확장 기능의 객체 중 하나를 사용해 로드되도록 하면 됩니다.
pg_clickhouse.pushdown_regex
pg_clickhouse.pushdown_regex 매개변수는 pg_clickhouse가
정규식 함수와 연산자를 pushdown할지 여부를 제어합니다. 기본적으로 활성화되어 있으며,
이들이 pushdown되지 않도록 하려면 이 매개변수를 false로 설정하십시오:
ALTER ROLE
SET 명령을 사용하여 pg_clickhouse를 사전 로드하거나
SET 매개변수를 설정하십시오:
RESET 명령을 사용하여 pg_clickhouse의 사전 로드
및/또는 매개변수를 재설정하십시오:
사전 로드
session_preload_libraries
데이터 타입
| ClickHouse | PostgreSQL | 비고 |
|---|---|---|
| Bool | boolean | |
| Date | date | |
| Date32 | date | |
| DateTime | timestamptz | |
| Decimal | numeric | |
| Float32 | real | |
| Float64 | double precision | |
| IPv4 | inet | |
| IPv6 | inet | |
| Int16 | smallint | |
| Int32 | integer | |
| Int64 | bigint | |
| Int8 | smallint | |
| JSON | jsonb, json | |
| String | text, bytea | |
| UInt16 | integer | |
| UInt32 | bigint | |
| UInt64 | bigint | 값이 BIGINT 최댓값을 초과하면 오류 발생 |
| UInt8 | smallint | |
| UUID | uuid |
BYTEA
SELECT 쿼리의 출력 결과는 다음과 같습니다:
함수 및 연산자 참고
함수
clickhouse_raw_query
host=localhost port=8123입니다. 지원되는 연결
매개변수는 다음과 같습니다:
host: 연결할 호스트입니다. 필수입니다.port: 연결할 HTTP 포트입니다.host가 ClickHouse Cloud 호스트가 아닌 경우 기본값은8123이고, ClickHouse Cloud 호스트인 경우 기본값은8443입니다.dbname: 연결할 데이터베이스의 이름입니다.username: 연결에 사용할 사용자 이름입니다. 기본값은default입니다.password: 인증에 사용할 비밀번호입니다. 기본값은 비밀번호를 사용하지 않는 것입니다.
EXECUTE 권한이 없습니다. 따라서 임시 ClickHouse
쿼리를 실제로 실행해야 하는 역할에만 GRANT로 액세스 권한을 부여하는 것이 좋습니다.
예를 들어 전용 ClickHouse 관리자 역할이 있습니다:
레코드를 반환하지 않는 쿼리에 유용하지만, 값을 반환하는 쿼리의 결과는
단일 텍스트 값으로 반환됩니다:
푸시다운 함수
pg_clickhouse는 조건식(HAVING 및 WHERE 절)에서 사용되는 PostgreSQL 내장 함수 일부를
ClickHouse로 푸시다운합니다. 해당 함수 집합은 다음과 같이 ClickHouse의
대응 함수에 매핑됩니다:
abs: absfactorial: factorialmod(int2/int4/int8/numeric): 모듈로pow&power(float8/numeric): powround: roundsin,cos,tan,atan,atan2,sinh,cosh,tanh,asinh,degrees,radians,pi: 동일한 이름의 ClickHouse 수학 함수입니다.asin,acos,atanh,acosh는 푸시다운되지 않습니다. 범위를 벗어난 입력에서는 PG는 오류를 발생시키지만 CH는NaN을 반환합니다.date_part:date_part('day'): toDayOfMonthdate_part('doy'): toDayOfYeardate_part('dow'): toDayOfWeekdate_part('year'): toYeardate_part('month'): toMonthdate_part('hour'): toHourdate_part('minute'): toMinutedate_part('second'): toSeconddate_part('quarter'): toQuarterdate_part('isoyear'): toISOYeardate_part('week'): toISOYeardate_part('epoch'): toISOYear
date_trunc:date_trunc('week'): toMondaydate_trunc('second'): toStartOfSeconddate_trunc('minute'): toStartOfMinutedate_trunc('hour'): toStartOfHourdate_trunc('day'): toStartOfDaydate_trunc('month'): toStartOfMonthdate_trunc('quarter'): toStartOfQuarterdate_trunc('year'): toStartOfYear
extract(field FROM source):date_part와 동일한 매핑입니다date(timestamp)&date(timestamptz): toDate (CH 별칭date로 다시 표현됨)array_position: indexOfarray_cat: arrayConcatarray_append: arrayPushBackarray_prepend: arrayPushFrontarray_remove: arrayRemovearray_length&cardinality: lengtharray_to_string: arrayStringConcatstring_to_array: splitByStringsplit_part: splitByString + 배열 인덱스trim_array: arrayResizearray_fill: arrayWithConstantarray_reverse: arrayReversearray_shuffle: arrayShufflearray_sample: arrayRandomSamplearray_sort: arraySort / arrayReverseSortbtrim: trimBothltrim: ltrimrtrim: rtrimconcat_ws: concatWithSeparatorlower(text): lowerUTF8upper(text): upperUTF8substring(text, ...)&substr(text, ...): substringUTF8substring(bytea, ...)&substr(bytea, ...): substringlength(text): lengthUTF8length(bytea)&octet_length: lengthreverse(text): reverseUTF8reverse(bytea): reversestrpos: positionUTF8regexp_like: matchregexp_replace:g플래그가 있으면 replaceRegexpOne 또는 replaceRegexpOneregexp_split_to_array: splitByRegexpmd5: MD5json_extract_path_text: 서브컬럼 구문json_extract_path: toJSONString + 서브컬럼 구문jsonb_extract_path_text: 서브컬럼 구문jsonb_extract_path: toJSONString + 서브컬럼 문법bit_count(bytea): bitCountto_timestamp(float8): fromUnixTimestampto_char(timestamp[tz], fmt): formatDateTimefmt가 모든 키워드에 대해 ClickHouse에 정확히 대응하는 문자열 상수인 경우입니다. 지원되는 키워드는 호환성 참고의 to_char()에서 확인하십시오. 그렇지 않으면 이 함수는 PostgreSQL에서 로컬로 평가됩니다.statement_timestamp,transaction_timestamp, &clock_timestamp: nowInBlock64 (nowInBlock64(9, $session_timezone))CURRENT_DATE: now와 toDate (toDate(now($session_timezone)))now,CURRENT_TIMESTAMP, &LOCALTIMESTAMP: now64 (now64(9, $session_timezone))CURRENT_TIMESTAMP(n)&LOCALTIMESTAMP(n): now64 (now64(n, $session_timezone))CURRENT_DATABASE: PostgreSQL 함수의 값으로 전달됩니다.CURRENT_SCHEMA: PostgreSQL 함수의 값으로 전달됩니다.CURRENT_CATALOG: PostgreSQL 함수에서 값으로 전달됩니다.CURRENT_USER: PostgreSQL 함수의 값으로 전달됩니다.USER: PostgreSQL 함수의 값으로 전달됩니다.CURRENT_ROLE: PostgreSQL 함수의 값으로 전달됩니다.SESSION_USER: PostgreSQL 함수의 값으로 전달됩니다.
푸시다운 연산자
- 배열 슬라이스 (
arr[L:U]): arraySlice @>(배열 포함): hasAll<@(배열에 포함됨): hasAll&&(배열 겹침): hasAny~(정규식 일치): match!~(정규식 불일치): match~*(대소문자를 구분하지 않는 정규식 불일치): match!~*(대소문자를 구분하지 않는 정규식 불일치): match->>(JSON/JSONB 요소를 텍스트로 추출): 서브컬럼 구문->(JSON/JSONB 추출): toJSONString + 서브컬럼 구문
사용자 정의 함수
pg_clickhouse가 생성하는 이러한 사용자 정의 함수는 PostgreSQL에 대응하는 함수가 없는 일부 ClickHouse 함수에 대해 원격 쿼리 푸시다운을 지원합니다. 이들 함수 중 하나라도 pushdown할 수 없으면 예외를 발생시킵니다.
확장 기능 푸시다운
re2
re2match→ matchre2extract→ extractre2extractall→ extractAllre2regexpextract→ regexpExtractre2extractgroups→ extractGroupsre2replaceregexpone→ replaceRegexpOnere2replaceregexpall→ replaceRegexpAllre2countmatches→ countMatchesre2countmatchescaseinsensitive→ countMatchesCaseInsensitivere2multimatchany→ multiMatchAnyre2multimatchanyindex→ multiMatchAnyIndexre2multimatchallindices→ multiMatchAllIndices
intarray
idx→ indexOf
fuzzystrmatch
soundex: soundexlevenshtein(2-arg): editDistanceUTF8
푸시다운 캐스트
CAST(x AS bigint)와 같은 캐스트 연산을 푸시다운합니다. 호환되지 않는 데이터 타입에서는 푸시다운이 실패합니다. 이 예시에서 x가 ClickHouse UInt64이면, ClickHouse는 해당 값의 형 변환을 거부합니다.
호환되지 않는 데이터 타입으로의 캐스트도 푸시다운할 수 있도록 pg_clickhouse는
다음 함수를 제공합니다. 이 함수가 푸시다운되지 않으면 PostgreSQL에서 예외를 발생시킵니다.
푸시다운 집계 함수
사용자 정의 집계 함수
pg_clickhouse에서 생성한 이러한 사용자 정의 집계 함수는 PostgreSQL에
해당 기능이 없는 일부 ClickHouse 집계 함수에 대해 원격 쿼리 푸시다운
기능을 제공합니다. 이 함수들 중 하나라도 푸시다운되지 않으면 예외가
발생합니다.
푸시다운 정렬된 집합 집계 함수
ORDER BY 표현식을 인수로 사용하여 ClickHouse의 매개변수화된 집계 함수에 대응됩니다. 예를 들어, 다음 PostgreSQL 쿼리:
ORDER BY 접미사인 DESC 및 NULLS FIRST는
지원되지 않으며 오류가 발생합니다.
percentile_cont(double): quantilequantile(double): quantilequantileExact(double): quantileExact
푸시다운 윈도우 함수
OVER (PARTITION BY ... ORDER BY ...) 절과 함께 ClickHouse로 푸시다운되며, 해당하는 경우 프레임 사양도 포함됩니다.
- row_number
- rank
- dense_rank
- ntile
- cume_dist
- percent_rank
- lead
- lag
- first_value
- last_value
- nth_value
min/max(OVER절 포함)
row_number, rank, dense_rank, ntile, cume_dist,
percent_rank)는 푸시다운 시 프레임 절을 생략하는데, ClickHouse가 이러한
함수에 대한 프레임 사양을 허용하지 않기 때문입니다.
호환성 참고사항
정규식
-
PostgreSQL은 POSIX Regular Expressions를 지원하고 ClickHouse는
RE2 Regular Expressions를 지원합니다. 동작 차이에 유의하십시오. 정규식이 ClickHouse에서 평가되는 경우(예:
WHERE절)에는 RE2로 작성하고, Postgres에서 평가되는 경우(예:SELECT절)에는 POSIX로 작성하십시오. -
pg_clickhouse는 Postgres의 [Regex flags]를 ClickHouse 정규식 앞에
(?)안에 붙여 넣는 방식으로 푸시다운합니다. 예를 들면 다음과 같습니다.다음과 같이 변환됩니다.여기에-s가 포함되는 점에 유의하십시오. 이는 ClickHouse에서 기본적으로 활성화되는s를 비활성화해 Postgres 정규식의 동작과 맞추기 위한 것입니다. Postgres 함수 호출의 플래그에s가 포함되어 있으면 pg_clickhouse는-s를 추가하지 않습니다. 하지만 안타깝게도 이 동작은 Postgres 24 이하 버전에서 일부 정규식의 호환성을 깨뜨립니다. -
두 시스템이 모두 지원하므로 ClickHouse에서 평가될 때 사용할 수 있는 플래그는 다음뿐입니다.
i: 대소문자를 구분하지 않음m: 멀티라인 모드:s:.이\n과 일치하도록 함p: 부분적인 개행 민감 매칭(s와 동일하게 처리됨)t: 엄격한 구문(기본값이며, pg_clickhouse가 제거함)
- 정규식 함수에 다른 플래그가 전달되면 해당 함수는 푸시다운되지 않습니다.
-
예외는
regexp_replace()이며, 이 함수는g플래그도 지원합니다.g가 설정되면 pg_clickhouse는replaceRegexpOne()대신replaceRegexpAll()을 사용하고, 다른 플래그를 앞에 붙이기 전에 해당 플래그를 제거합니다. -
Postgres
regexp_replace()의 replacement 인수는 전체 일치를 가리키는 데\&를 지원하지만, ClickHouse에서는 전체 일치에\0를 사용합니다. 함수가 ClickHouse로 푸시다운될 때는 반드시\0를 사용하십시오.
to_char()
timestamp 및 timestamp with time zone에 대한 PostgreSQL to_char()는 포맷 인수가
NULL이 아닌 문자열 상수이고, 여기에 포함된 모든 PostgreSQL 키워드에 바이트 단위로
완전히 동일한 ClickHouse 대응 키워드가 있을 때에만 ClickHouse formatDateTime으로
푸시다운됩니다. 포맷이 동적이거나
(Const가 아니거나), 지원되지 않는 키워드 또는 수정자가 하나라도 포함되어 있으면
해당 호출은 PostgreSQL에서 로컬로 평가됩니다 — 부분 번역으로는
푸시다운을 전혀 시도하지 않으므로 출력은 PG 호환성을 유지합니다.
numeric, interval 및 기타
타임스탬프가 아닌 타입에 대한 2개 인수 to_char() 형식은 푸시다운되지 않습니다. ClickHouse formatDateTime은
날짜/시간 값만 포맷합니다.
변환된 키워드
| PostgreSQL | ClickHouse | 의미 |
|---|---|---|
YYYY, yyyy | %Y | 4자리 연도 |
YY, yy | %y | 2자리 연도 |
MM, mm | %m | 0으로 채운 월 (01–12) |
DD, dd | %d | 0으로 채운 일 (01–31) |
DDD, ddd | %j | 0으로 채운 연중 날짜 (001–366) |
HH24, hh24 | %H | 0으로 채운 24시간제 시 (00–23) |
HH, hh, HH12, hh12 | %I | 0으로 채운 12시간제 시 (01–12) |
MI, mi | %i | 0으로 채운 분 (00–59) |
SS, ss | %S | 0으로 채운 초 (00–59) |
Q, q | %Q | 분기 (1–4) |
Mon | %b | 축약된 월 이름(예: Oct) |
Dy | %a | 축약된 요일 이름(예: Mon) |
AM, PM | %p | 오전/오후 표시, 항상 대문자 |
인용된 텍스트와 리터럴
"..."로 감싼 텍스트는 그대로 전달되며, 리터럴 %는
ClickHouse의 지정자 접두사를 이스케이프하기 위해 %%로 두 번
표시됩니다. 따옴표 밖의 \"도 리터럴 "로 그대로 전달됩니다. "..." 내부에서는 백슬래시가
"만 이스케이프하고, 그 외의 백슬래시 시퀀스는 리터럴 텍스트로 처리됩니다.
David E. Wheeler