Snowflake

Snowflake 데이터베이스, 스키마, 테이블 생성 및 컨테이너 구조

LeeJaeJun 2025. 6. 17. 21:44
728x90
728x90

Snowflake 컨테이너 계층 구조

  • Organization
    • Account (Snowflake 인스턴스)
      • Account-Level Objects (User, Role, Warehouse 등)
      • Database
        • Schema
          • Tablwe, View, Procedure, File Format, Stream 등

계정 간 테이블 직접 접근은 불가하며, 반드시 Secure Share 기능을 통해야 함 (A 회사의 Snowflake 계정에서 B 회사의 Snowflake 계정의 테이블에 접근하는 것이 불가능하다는 의미)

 

Secure Share 작동 방식

1. 공급자(Snowflake 계정 A)

  • CREATE SHARE myshare;
  • GRANT USAGE ON DATABASE mydb TO SHARE myshare;
  • ADD TABLE mytable TO SHARE myshare;

2. 소비자(Snowflake 계정 B)

  • 공급자가 공유한 myshare를 수락하면,
  • B 계정에서 읽기 전용(shared) 데이터베이스로 접근 가능
 
SELECT * FROM shared_db.schema.mytable;

공급자(Snowflake 계정 A)

CREATE SHARE myshare;
GRANT USAGE ON DATABASE mydb TO SHARE myshare;
ADD TABLE mytable TO SHARE myshare;

소비자(Snowflake 계정 B)

  • 공급자가 공유한 myshare를 수락하면,
  • B 계정에서 읽기 전용(shared) 데이터베이스로 접근 가능
  • 데이터를 복사하지 않고, 실시간으로 공급자의 데이터를 그대로 읽을 수 있음
  • 데이터 이동, 스냅샷, ETL 작업 없이 공유 가능
SELECT * FROM shared_db.schema.mytable;
 

 

객체 생성 기본 흐름

-- 데이터베이스 생성
CREATE DATABASE mydb COMMENT='내 DB';

-- 스키마 생성
CREATE SCHEMA mydb.myschema COMMENT='내 스키마';

-- 테이블 생성
CREATE TABLE myschema.mytable (
  id NUMBER AUTOINCREMENT,
  name VARCHAR(50),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 컨텍스트 확인
SELECT CURRENT_ROLE(), CURRENT_DATABASE(), CURRENT_SCHEMA();

 

테이블 종류

  • Permanent Table
    • 기본 테이블
    • Time Travel 및 Fail-safe 모두 지원
  • Transient Table
    • Time Travel 지원
    • Fail-safe는 미지원 (그래서 저장 비용이 더 저렴)
  • Temporary Table
    • 세션 종료 시 자동 삭제 (임시 저장용)
CREATE TRANSIENT TABLE temp_table (...);
CREATE TEMPORARY TABLE session_table (...);

 

주요 데이터 타입 및 특징

정형 데이터 타입

  • NUMBER, DECIMAL, INT, FLOAT -> 내부적으로는 모두 NUMBER
  • VARCHAR, STRING, CHAR, TEXT -> 기본 최대 16MB (길이 미지정 시)
  • BOOLEAN -> 1/0, 'true'/'false' 등 자동 변환
  • DATE, TIME, TIMESTAMP -> UTC 기준 저장, 세션별 TIMEZONE 설정 가능

반정형 데이터 타입

  • VARIANT -> JSON, XML, Parquet 등 저장 및 쿼리 가능
  • OBJECT, ARRAY -> VARIANT의 구조화된 형태

 

제약 조건

  • NOT NULL: 실제로 강제됨
  • PRIMARY KEY
  • UNIQUE
  • FORIEGN KEY

PRIMARY KEY, UNIQUE, FORIEGN KEY는 선언만 하는 것이며 강제되지는 않음

* Snowflake에서는 데이터 적합성을 ETL 레벨에서 보장해야 하며, 쿼리 수행 중 위 제약조건은 무시가 됨

 

데이터 로딩 방식

1. INSERT 또는 CTAS

INSERT INTO mytable (name) VALUES ('Alice');
CREATE TABLE myctas AS SELECT * FROM mytable;

2. Web UI

  • CSV 업로드 (100MB 이하)
  • File Format 사전 지정 필요
  • 자동 생성된 COPY INTO SQL 확인 가능

3. SnowSQL CLI

PUT file:///data.csv @my_stage;
COPY INTO mytable FROM @my_stage FILE_FORMAT=(FORMAT_NAME='my_csv');

 

Time Travel과 데이터 변경 추적

  • 최대 90일까지 이전 시점 데이터 복원 가능 (에디션별 상이)
SELECT * FROM mytable BEFORE(STATEMENT => 'abcd-1234-...');  -- 특정 쿼리 실행 전

AT 또는 OFFSET 구문도 가능하며, UNDO 기능 또는 변경 내역 감사에 유용

 

외부 테이블과 VARIANT

-- VARIANT 타입 테이블 생성
CREATE TABLE json_table (v VARIANT);

-- 외부 JSON 데이터 로드
COPY INTO json_table FROM @my_stage FILE_FORMAT=(TYPE='JSON');

-- 외부 테이블 생성 (S3 등 연동)
CREATE EXTERNAL TABLE ext_table (
  v VARIANT
)
LOCATION=@my_stage
FILE_FORMAT=(TYPE='JSON');

 

728x90
300x250

'Snowflake' 카테고리의 다른 글

Snowflake 주요 특징  (0) 2025.06.17
Snowflake와 기존 클라우드 데이터 웨어하우스 차이  (0) 2025.06.17
Snowflake Snowsight (Modern Web UI)  (0) 2025.06.17
Snowflake Legacy Web UI  (1) 2025.06.16
Snowflake Architecture  (1) 2025.06.14