Exasol 설정
Exasol 설정
dbt-exasol 어댑터에서 incremental 전략, 테이블 분산/파티셔닝, 모델 contract, 타임스탬프 형식, unit test 제약 등을 다루는 페이지예요. Exasol 특유의 성능 최적화와 제한 사항을 정확히 알고 쓰는 게 중요해요.
출처: 문서
본문
Incremental materialization 전략
dbt-exasol에서 지원하는 incremental materialization 전략은 다음과 같아요:
append(unique_key가 정의되지 않았을 때 기본값)mergedelete+insert(unique_key가 정의되었을 때 기본값)microbatch
이 모든 전략은 dbt에서 상속받은 거예요. incremental 전략에 대한 자세한 내용은 incremental strategy 문서를 참고하세요.
성능 최적화 (Performance optimizations)
테이블 분산과 파티셔닝
dbt-exasol 1.8.1부터 테이블 분산(distribution)과 파티셔닝 전략을 구성해 Exasol의 쿼리 성능을 최적화할 수 있어요. 이 구성은 table 또는 incremental로 materialize된 모델에서 사용할 수 있어요.
Exasol이 지원하는 성능 최적화 구성:
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
partition_by_config |
<string> 또는 [<string>] |
no | 지정한 컬럼으로 테이블을 파티셔닝해 쿼리 성능을 높여요 |
distribute_by_config |
<string> |
no | 지정한 컬럼으로 클러스터 노드에 데이터를 분산해요 |
primary_key_config |
[<string>] |
no | 기본 키 제약 조건을 정의해요 |
Project YAML 파일
dbt_project.yml
models:
<resource-path>:
+materialized: table
+partition_by_config: <column-name>
+distribute_by_config: <column-name>
+primary_key_config: [<column-name>]
Properties YAML 파일
models/properties.yml
models:
- name: [<model-name>]
config:
materialized: table
partition_by_config: <column-name>
distribute_by_config: <column-name>
primary_key_config: [<column-name>]
SQL 파일 config
models/<model_name>.sql
{{ config(
materialized="table",
partition_by_config="<column-name>",
distribute_by_config="<column-name>",
primary_key_config=["<column-name>"]
) }}
단일 컬럼 예시
다음 예시는 order_date로 파티셔닝되고 customer_id로 분산되며 customer_id를 기본 키로 가진 테이블을 만들어요:
models/orders.sql
{{
config(
materialized='table',
primary_key_config=['customer_id'],
partition_by_config='order_date',
distribute_by_config='customer_id'
)
}}
select
customer_id,
order_date,
order_total,
order_status
from {{ source('sales', 'orders') }}
여러 컬럼 예시
primary_key_config에 여러 컬럼을 구성할 때는 리스트로 제공하세요:
models/order_items.sql
{{
config(
materialized='incremental',
primary_key_config=['order_id', 'item_id'],
partition_by_config='order_date',
distribute_by_config='order_id',
unique_key=['order_id', 'item_id']
)
}}
select
order_id,
item_id,
order_date,
quantity,
price
from {{ source('sales', 'order_items') }}
info
primary_key_config에 여러 컬럼을 구성할 때는 항상 리스트로 제공하세요: ['column1', 'column2']
Exasol의 테이블 분산과 파티셔닝에 대한 자세한 내용은 Exasol documentation을 참고하세요.
모델 contract (Model contracts)
Exasol은 다음 데이터베이스 제약 조건과 함께 모델 contract를 지원해요:
| 제약 조건 유형 | 지원 상태 | 설명 |
|---|---|---|
not_null |
✅ 적용됨 | 컬럼에서 NULL 값을 방지해요 |
primary_key |
✅ 적용됨 | 유니크함과 NOT NULL을 강제해요 |
foreign_key |
✅ 적용됨 | 다른 테이블의 기본 키를 참조해요 |
check |
❌ 지원 안 함 | 커스텀 검증 표현식을 지원하지 않아요 |
unique |
❌ 지원 안 함 | 유니크 제약 조건을 지원하지 않아요 |
적용된 제약 조건 예시
models/customers.yml
models:
- name: customers
config:
contract:
enforced: true
columns:
- name: customer_id
data_type: integer
constraints:
- type: not_null
- type: primary_key
- name: email
data_type: varchar(255)
constraints:
- type: not_null
- name: country_id
data_type: integer
constraints:
- type: foreign_key
expression: countries (country_id)
모델 contract에 대한 자세한 내용은 model contracts 문서를 참고하세요.
타임스탬프 형식 (Timestamp format)
dbt-exasol 1.2.2부터 기본 타임스탬프 형식은 YYYY-MM-DDTHH:MI:SS.FF6이에요.
프로필 구성에서 타임스탬프 형식을 커스터마이즈할 수 있어요:
profiles.yml
outputs:
dev:
type: exasol
timestamp_format: 'YYYY-MM-DD HH24:MI:SS.FF3'
# ... other settings
Microbatch 전략 고려 사항
microbatch incremental 전략을 사용할 때, Exasol은 모델 정의에서 시간대 접미사가 없는 타임스탬프를 요구해요:
-- ✅ Correct (Exasol compatible)
TIMESTAMP '2024-01-01 10:00:00'
-- ❌ Incorrect (will cause parse errors)
TIMESTAMP '2024-01-01 10:00:00-0'
dbt-exasol 어댑터는 microbatch 경계의 타임스탬프 형식을 자동으로 처리해요.
microbatch 전략에 대한 자세한 내용은 microbatch 문서를 참고하세요.
Materialized views
Exasol은 materialized view를 지원하지 않아요. materialized='materialized_view'를 시도하면 오류로 실패해요.
해결 방법 (Workarounds)
- 적절한 새로고침 로직과 함께
materialized='table'사용 - 적합한 incremental 전략과 함께
materialized='incremental'사용
Clone 연산
Exasol은 테이블 clone 연산을 지원하지 않아요. 이는 CLONE 기능에 의존하는 dbt 기능에 영향을 줘요.
Unit test 제한 사항
Exasol은 unit tests에 특정한 제한이 있어요:
빈 문자열 처리 (Empty string handling)
Exasol에서 빈 문자열은 NULL로 처리돼요. 이는 빈 값을 시뮬레이션하기 위해 빈 문자열 리터럴을 사용하는 테스트 픽스처에 영향을 줘요. seed 데이터로 unit test를 작성할 때 다음을 유의하세요:
# This seed data
id,name,value
1,test,"" # Empty string
# Will be interpreted as
id,name,value
1,test,NULL # NULL value in Exasol
크로스 데이터베이스 테스트
모델과 다른 데이터베이스의 source에 의존하는 unit test는 지원되지 않아요. 모든 테스트 픽스처와 모델은 같은 데이터베이스에 있어야 해요.
CTE의 집계 함수
Exasol은 dbt의 unit test 픽스처에서 만든 공통 테이블 표현식(CTE) 안에서 일부 집계 함수(LISTAGG, MEDIAN, PERCENTILE_CONT)를 지원하지 않아요. 이 함수들은 사용자 생성 테이블이 필요해요.
해결 방법: 이 함수들로 모델을 테스트할 때 인라인 CTE 대신 테스트 픽스처용 실제 테이블을 만드세요.
materialized 테스트 픽스처 지원에 관심이 있다면, GitHub에서 이 이슈에 참여해 주세요: dbt-labs/dbt#8499
연결 구성 (Connection configuration)
암호화, SSL/TLS 검증, OpenID 인증 등 연결 파라미터와 기타 프로필 설정에 대한 자세한 내용은 Exasol setup 문서를 참고하세요.
더 알아보기 (Learn more)
- Exasol CREATE TABLE 문서에서 분산/파티셔닝 관련 내용을 확인하세요.
- incremental 전략에 대한 자세한 설명은 incremental strategy 문서를 참고하세요.