728x90
728x90
Snowflake 컨테이너 계층 구조
- Organization
- Account (Snowflake 인스턴스)
- Account-Level Objects (User, Role, Warehouse 등)
- Database
- Schema
- Tablwe, View, Procedure, File Format, Stream 등
- Schema
- Account (Snowflake 인스턴스)
계정 간 테이블 직접 접근은 불가하며, 반드시 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 |