LabHub

DuckDB — 파일 위에서 바로 분석하는 열 지향 엔진 · 파이프라인과 연동 · 퀴즈

퀴즈: 파이프라인과 연동

LabHub 에서 이어서 보기

문항 8개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.

  1. 이 실습 환경에서 `INSTALL postgres` 는 실패하고 `LOAD postgres` 는 된다. 두 명령의 차이는?

    1. INSTALL 은 관리자 권한이 필요한 명령이고 LOAD 는 일반 사용자도 쓸 수 있다
    2. INSTALL 은 확장을 컴파일하는 명령이라 빌드 도구가 없는 환경에서는 실패한다
    3. LOAD 는 확장 없이 내장 기능만 켜는 명령이라 어떤 환경에서도 실패하지 않는다
    4. INSTALL 은 저장소에서 확장 파일을 받아 오고, LOAD 는 이미 받아 둔 파일을 프로세스에 올린다
  2. `ATTACH … AS pg (TYPE postgres)` 뒤 `pg.public.orders` 를 질의하면 데이터는 어디서 오나?

    1. 질의할 때마다 PostgreSQL 에서 읽어 온다 — 필터는 밀어 보내지만 조인·집계는 DuckDB 가 한다
    2. ATTACH 시점에 모든 표가 로컬로 복사되고 이후 질의는 그 복사본을 읽는다
    3. 질의 전체가 PostgreSQL 로 넘어가 거기서 실행되고 결과만 돌아온다
    4. 첫 질의 때 표가 캐시되고 이후에는 PostgreSQL 에 다시 묻지 않는다
  3. 운영 표를 `create table orders as from pg.public.orders` 로 로컬에 복사하고 집계하는 이유로 가장 알맞은 것은?

    1. DuckDB 는 원격 표에 조인을 지원하지 않아 복사하지 않으면 두 표를 붙일 수 없다
    2. 복사본은 자동으로 인덱스가 만들어져 어떤 질의든 원본보다 빠르다
    3. 무거운 집계가 운영 DB 의 자원을 먹지 않게 하고, 반복 질의마다 표 전체가 건너오는 비용을 없앤다
    4. PostgreSQL 의 형이 DuckDB 와 달라 복사하면서 형을 변환해야만 집계가 가능하다
  4. 집계 결과를 다른 도구에 넘길 때 CSV 대신 Parquet 를 쓰라는 이유는?

    1. Parquet 는 텍스트라 사람이 열어 볼 수 있으면서도 CSV 보다 압축이 잘 되기 때문이다
    2. 스키마·형·압축이 파일 안에 있어 받는 쪽이 형을 다시 추론할 필요가 없기 때문이다
    3. CSV 는 한 파일에 한 표만 담지만 Parquet 는 여러 표를 한 파일에 담을 수 있기 때문이다
    4. Parquet 는 PostgreSQL 이 직접 읽을 수 있는 유일한 파일 형식이기 때문이다
  5. 보고서 스크립트에서 `duckdb.connect(경로, read_only=True)` 로 여는 이유로 알맞지 않은 것은?

    1. 스크립트가 실수로 표를 고치거나 지우는 일을 막는다
    2. 다른 읽기 전용 프로세스와 같은 파일을 동시에 열 수 있다
    3. 보고서 질의가 쓰기 잠금을 잡지 않아 채점기 같은 다른 읽기가 막히지 않는다
    4. 쓰기로 열어 둔 CLI 가 있어도 그 잠금을 건너뛰고 읽을 수 있다
  6. `insert or ignore into sales select * from read_csv(…)` 가 겹치는 행을 건너뛰려면 무엇이 필요한가?

    1. read_csv 에 `ignore_errors = true` 를 주어 중복 행을 오류로 취급하게 해야 한다
    2. sales 표에 sale_id 기본 키(또는 UNIQUE 제약)가 있어야 '이미 있는 행' 을 표가 안다
    3. insert 전에 `set preserve_insertion_order = false` 로 순서 보장을 꺼야 한다
    4. 원본 파일이 sale_id 순으로 정렬돼 있어야 엔진이 앞 행과 비교할 수 있다
  7. 되돌려 쓰기를 `insert into pg.public.duck_country_month select …` 로 했더니 돌릴 때마다 행이 두 배가 된다. 멱등하게 만드는 방법은?

    1. `create or replace table pg.public.duck_country_month as select …` 로 표를 통째로 갈아 끼운다
    2. insert 앞에 `begin` 을 두고 뒤에 `commit` 을 붙여 트랜잭션 안에서 실행한다
    3. PostgreSQL 쪽 표에 트리거를 달아 같은 국가·월이 들어오면 거부하게 한다
    4. DuckDB 의 country_month 표를 먼저 비우고 다시 채운 뒤 insert 한다
  8. `strftime(ordered_at, '%Y-%m')` 을 TIMESTAMP WITH TIME ZONE 열에 쓰면 월은 무엇을 기준으로 정해지나?

    1. 값이 저장될 때의 원래 오프셋(+09 등)을 기준으로 정해진다
    2. 항상 UTC 를 기준으로 정해지며 세션 설정과 무관하다
    3. 세션의 TimeZone 설정을 기준으로 정해지므로 환경이 다르면 월이 달라질 수 있다
    4. 날짜 부분만 보고 시각은 무시하므로 시간대와 관계없이 같다