[Snowflake Partner Technical Bootcamp] 2. Storage Layer

Snowflake - Storage Layer

Compute Layer์™€ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š” ํ†ตํ•ฉ/๋‹จ์ผ ์ €์žฅ์†Œ ๊ณ„์ธต์ด๋‹ค. Snowflake์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” centralized๋˜์–ด ์ด storage์— ์ €์žฅ๋œ๋‹ค.

storage layer

ํŠน์ง•๊ณผ ๊ธฐ๋Šฅ๋“ค์„ ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด์ž.


ํŠน์ง•

optimized storage

ํ†ตํ•ฉ๋œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ

  • ์ •ํ˜•, ๋ฐ˜์ •ํ˜•, ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ํ†ตํ•ฉ ์ €์žฅ์†Œ๋ฅผ ์ œ๊ณต
  • ๋ถ„์‚ฐ๋˜์–ด ์ €์žฅ๋˜์ง€ ์•Š๊ณ , ํ†ตํ•ฉ ์ €์žฅ์†Œ ํ•œ ๊ณณ์—๋งŒ ์ €์žฅ๋˜์–ด replica ์ƒ์„ฑ ๋ถˆํ•„์š”
  • ํ•„์š” ์‹œ ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ์ด On-Demand ๋ฐฉ์‹์œผ๋กœ ์ž๋™ ํ™•์žฅ


๊ฐ„ํŽธํ•œ ๊ด€๋ฆฌ

  • ์ตœ์ ํ™”๋œ ์••์ถ•(80% ์ด์ƒ) ๋ฐ ๊ฐ•๋ ฅํ•œ ๋ฐ์ดํ„ฐ ๋ณด์•ˆ ์ง€์›


์œ ์—ฐ์„ฑ ๋ฐ ํ†ตํ•ฉ์„ฑ ์ง€์›

  • S3์™€ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์ €์žฅ์†Œ, Iceberg์™€ ๊ฐ™์€ open source ๋ฐ On-Premise์— ์ €์žฅ๋œ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์ง์ ‘ ์—ฐ๊ฒฐ ์ง€์›


Stage & Table

Snowflake์—๋Š” Stage์™€ Table์ด ์žˆ๋‹ค. ๊ฐ๊ฐ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Stage

Internal Stage

๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ Snowflake ๋‚ด๋ถ€์— ์—…๋กœ๋“œํ•  ๋•Œ ์ƒ์„ฑํ•œ๋‹ค. Table์— ํŒŒ์ผ ๋‚ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์ „ ์ž„์‹œ Stage ์ •๋„๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.


External Stage

Snowflake ์™ธ๋ถ€ ์ €์žฅ์†Œ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ฐธ์กฐํ•œ๋‹ค. ํ˜„์žฌ ์•„๋ž˜ 3๊ฐ€์ง€ ํด๋ผ์šฐ๋“œ ์ €์žฅ์†Œ ์„œ๋น„์Šค๊ฐ€ ์ง€์›๋œ๋‹ค. Table์— ํŒŒ์ผ ๋‚ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์ „ ์ž„์‹œ Stage ์ •๋„๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

  • Amazon S3 buckets
  • Google Cloud Storage buckets
  • Microsoft Azure containers


Internal Table

  • Snowflake์˜ ๋‚ด๋ถ€ ์Šคํ† ๋ฆฌ์ง€์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ž์ฃผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜ ์งง์€ ์‹œ๊ฐ„์— ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉ
  • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์ œ์–ด๋ฅผ ์ œ๊ณต
  • ์™ธ๋ถ€ ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” ๋” ๋น ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.


External Table

  • ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค ์™ธ๋ถ€์˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ฐ์ฒด

  • ์Šค๋…ธ์šฐํ”Œ๋ ˆ์ดํฌ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์— ์ง์ ‘ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€๋‚˜ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” External Stage๋ฅผ ํ†ตํ•ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ์ €์žฅ์†Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ƒ ํ…Œ์ด๋ธ”๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๋ทฐ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ์ฝ๊ธฐ ์ „์šฉ์ธ ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.

  • ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐ ์‚ญ์ œ ์‹œ๊ฐ„์ด ๋น ๋ฆ„

  • ๋ฐ์ดํ„ฐ ์šฉ๋Ÿ‰ ์ œํ•œ์ด ์—†์Œ
  • ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์ž‘์—… ์—†์ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ณต์œ  ๊ฐ€๋Šฅ

  • snowflake ์™ธ๋ถ€์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— internal table ๋ณด๋‹ค ์ฟผ๋ฆฌ ์†๋„๊ฐ€ ๋Š๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” External Table์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” Materalized View๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.


Snowflake Ingestion

์™ธ๋ถ€ ์ €์žฅ์†Œ๋‚˜ ์„œ๋น„์Šค, ํˆด๋“ค์„ ํ†ตํ•ด snowflake๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.

snowflake ingestion

1. ETL Tools

Snowflake๋Š” ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์ž์‚ฌ๊ฐ€ nativeํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” ํŒŒํŠธ๋„ˆ์‚ฌ๋“ค์˜ ํˆด๋“ค์„ ๋งŽ์ด ์ด์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ native๋Š” ํ•ด๋‹น ํˆด๋“ค์„ ์ด์šฉํ•˜์—ฌ Snowflake์˜ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์™€ ๋†’์€ ํ˜ธํ™˜์„ฑ์„ ๊ฐ€์ ธ ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ ์žฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋”์šฑ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ETL Tools ๊ด€๋ จ ํŒŒํŠธ๋„ˆ์‚ฌ ๊ด€๋ จ ์ •๋ณด๋Š” ํ•ด๋‹น ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.


2~3. External Cloud Storage

S3์™€ ๊ฐ™์€ ์™ธ๋ถ€ ํด๋ผ์šฐ๋“œ ์ €์žฅ์†Œ์—์„œ snowflake๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ Bulk Load ๋ฐฉ์‹๊ณผ Continuous ๋ฐฉ์‹์ด ์žˆ๋‹ค.

Bulk Load

์™ธ๋ถ€ ํด๋ผ์šฐ๋“œ ์ €์žฅ์†Œ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ Stage๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์ €์žฅํ•  ํŒŒ์ผ์— ํ•ด๋‹นํ•˜๋Š” Format์„ ์ƒ์„ฑํ•˜๊ณ  COPY INTO ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ snowflake storage๋กœ Bulk Load ํ•  ์ˆ˜ ์žˆ๋‹ค.

> CREATE STAGE my_external_stage
  URL = 's3://my-bucket/my-path/'
> create or replace file format csv type='csv'
  compression = 'auto' field_delimiter = ',' record_delimiter = '\n'
  skip_header = 0 field_optionally_enclosed_by = '\042' trim_space = false
  error_on_column_count_mismatch = false escape = 'none' escape_unenclosed_field = '\134'
  date_format = 'auto' timestamp_format = 'auto' null_if = ('') comment = 'file format for ingesting data to snowflake';
> copy into trips from @my_external_stage file_format=csv pattern= '.*csv.*';


์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์™ธ๋ถ€ ํด๋ผ์šฐ๋“œ ์ €์žฅ์†Œ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œ, ์–ธ๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

snowflake external storage bulk load


Continuous

S3๋Š” ๋ฐ์ดํ„ฐ์˜ ์ง€์†์  ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ด๋ฒคํŠธ ์•Œ๋ฆผ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด SQS์— notification์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด notification์„ ๋ฐ”๋ผ๋ณด๋ฉฐ Snowpipe service๋กœ ๋ฐ์ดํ„ฐ๋ฅผ snowflake ์ ์žฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

snowflake external storage continuous injestion

Snowpipe์— ๋Œ€ํ•œ ์„ค๋ช…์€ Service Layer ์žฅ์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.


4. Kafka Connector

Kafka Connector๋Š” Apache Kafka์™€ Snowflake ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋กœ, ํŒŒํŠธ๋„ˆ์‚ฌ์˜ ETL Tool ๋‹ค์Œ์œผ๋กœ ๊ถŒ์žฅํ•˜๋Š” Connector ์ด๋‹ค.

Kafka Connector๋Š” ํ…Œ์ด๋ธ” ์ด๋ฆ„๊ณผ ์Šคํ‚ค๋งˆ, ๋ฐ์ดํ„ฐ ํƒ€์ž…, ์ธ๋ฑ์Šค ๋“ฑ์˜ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” Snowflake ํ…Œ์ด๋ธ”์„ ์ž์‹ ์˜ ์š”๊ตฌ์— ๋งž๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์†๋„์™€ ํšจ์œจ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

snowflake kafka-connector-flow

์œ„ ๊ทธ๋ฆผ์— ๋Œ€ํ•œ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด JSON ๋˜๋Š” Avro ๋ ˆ์ฝ”๋“œ๋ฅผ Kafka ํด๋Ÿฌ์Šคํ„ฐ์— ๊ฒŒ์‹œํ•œ๋‹ค. ๋ ˆ์ฝ”๋“œ๋Š” 1๊ฐœ ์ด์ƒ์˜ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ถ„ํ• ๋œ๋‹ค.

  2. ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ : Kafka Connector๋Š” Kafka ํ† ํ”ฝ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค.

    ๋ฐ์ดํ„ฐ ๋ฒ„ํผ๋ง : ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ฒ„ํผ๋ง์„ ์œ„ํ•ด ์ผ์‹œ์ ์ธ ์Šคํ† ๋ฆฌ์ง€ ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค. ์ด๋•Œ, ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์€ 100MB์ด๋‹ค.

    ํŒŒ์ผ ์ ์žฌ : ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐจ๊ฑฐ๋‚˜ ๋กœ๋”ฉ ์ž‘์—…์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฉด, ๋ฒ„ํผ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ํŒŒ์ผ๋กœ Topic๊ณผ Partition๋ณ„๋กœ ์ƒ์„ฑ๋œ Internal Stage์— ์ ์žฌ๋œ๋‹ค.

  3. Internal Stage์— ํŒŒ์ผ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ํ›„, Topic๊ณผ Partition๋ณ„๋กœ Snowpipe๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ Internal Stage์—์„œ ์ฝ์–ด์™€ Snowflake Storage์— ์ ์žฌํ•œ๋‹ค.

  4. Kafka Connector๋Š” Snowpipe๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜์—ฌ ํŒŒ์ผ ๋ฐ์ดํ„ฐ๊ฐ€ ํ…Œ์ด๋ธ”์— ์ ์žฌ๋œ ๊ฒƒ์„ ํ™•์ธํ•œ ํ›„, Internal Stage์˜ ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค. ์‹คํŒจ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, Kafka Connector๋Š” ํŒŒ์ผ์„ Internal Stage๋กœ ์ด๋™ํ•˜๊ณ  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  5. ์ปค๋„ฅํ„ฐ๋Š” 2~4 ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.


5~8. Other Connector

๊ฐ ์„œ๋น„์Šค๋“ค์€ ํ•ด๋‹น ์„œ๋น„์Šค์— ๋Œ€ํ•œ Snowflake Connector๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ Snowflake Storage๋กœ ์ ์žฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

Snowflake๋Š” ๊ณ„์†ํ•˜์—ฌ ๊ฐ ์„œ๋น„์Šค์— ๋Œ€ํ•œ Connector ์ง€์›์„ ๋„“ํ˜€๊ฐ€๊ณ  ์žˆ๋‹ค.


Data Loading In Snowflake Storage

snowflake data loading


Structured & Semi-structured data

Snowflake๋Š” ์ •ํ˜• ๋ฐ์ดํ„ฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐ˜์ •ํ˜• ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋„ ์ตœ์ ํ™”๋œ ์ €์žฅ์†Œ๋ฅผ ์ง€์›ํ•œ๋‹ค.

snowflake structure semi-structure data

์ •ํ˜• ๋ฐ์ดํ„ฐ

  • ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์‹œ, ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ์— 1:1 ๋งคํ•‘ํ•˜์—ฌ ์ €์žฅ
  • COPY INTO์‹œ, ์ž๋™์œผ๋กœ Snowflake ์ €์žฅ ํ˜•์‹์— ๋งž๊ฒŒ ๋ณ€ํ™˜๋จ
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ์‹œ์ ์— ์ž๋™์œผ๋กœ ๋ฉ”ํƒ€์ •๋ณด์™€ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ


์•„๋ž˜์™€ ๊ฐ™์€ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๋ฉด

product cost quantity code
Apple 1105 250 FIH-2316
Samsung 980 202 IHO-6912
LG 780 600 WHQ-6090

์กฐํšŒ ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

SELECT product, cost. quantity, code FORM product_info


๋ฐ˜์ •ํ˜• ๋ฐ์ดํ„ฐ

  • ๋‹ค์–‘ํ•œ datatype ์ง€์› (JSON, Avro, Parquet, ORC, XML, Delta Lake, CSV, TSV, protobuf)

  • ์›๋ณธ ๋ฐ์ดํ„ฐ(Document)๋ฅผ ๊ทธ๋Œ€๋กœ ์ €์žฅ
  • SQL๋กœ ์ฒ˜๋ฆฌ๊ฐ€๋Šฅ : Dot notation


์•„๋ž˜์™€ ๊ฐ™์€ JSON ํŒŒ์ผ์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๋ฉด

> SELECT * FROM sample_table;
+-----------------------------------------+
|SRC                                      |
|-----------------------------------------|
|{                                        |
|    "users": [                           |
|        {                                |
|            "city": "Seoul",             |
|            "first_name": "Kitae",       |
|            "gender": "male",            |
|            "job": "data engineer",      |
|            "last_name": "Kim"           |
|        },                               |
|        {                                |
|            "city": "Seoul",             |
|            "first_name": "Heedong",     |
|            "gender": "male",            |
|            "job": "data engineer",      |
|            "last_name": "Park"          |
|        }                                |
|    ]                                    |
|}                                        |
+-----------------------------------------+

JSON์˜ ๊ฐ key ์ด๋ฆ„์„ ํ†ตํ•ด value์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์กฐํšŒ ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

> SELECT
	value:first_name::STRING AS first_name
  FROM sample_table
  	, LATERAL FLATTEN( INPUT => SRC:users );
+--------------------------+
| value:first_name::STRING |
|--------------------------|
| Kitae                    |
| Heedong                  |
+--------------------------+


Micro-Partitions

Snowflake์—์„œ ๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ํšจ์œจ์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Micro-Partition์ด๋ผ๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ๊ณ ์œ ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. Micro-Partition์€ ์ •์  ํŒŒํ‹ฐ์…˜์—์„œ ์ œ๊ณตํ–ˆ๋˜ ์žฅ์ ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•˜๋ฉด์„œ ๋™์‹œ์— ๋‹จ์ ์„ ํ•ด๊ฒฐํ•œ Snowflake ๋งŒ์˜ ๊ณ ์œ ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

์•„ํ‚คํ…์ณ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์žฌ๋˜์–ด Micro-Partition์œผ๋กœ ๋ถ„ํ• , ์••์ถ•๋˜์–ด ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

snowflake micro partitions loading data

Snowflake๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋ฉฐ, ์ด ์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ €์žฅํ•œ๋‹ค. ์ด ๋ถ„ํ• ๋œ ๊ฐ๊ฐ์˜ ์ž‘์€ ๋‹จ์œ„๋ฅผ Micro-Partition ์ด๋ผ๊ณ  ํ•œ๋‹ค.

snowflake micro partition

Snowflake์—์„œ ๋ฐ์ดํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋กœ ์„ค์ •๋œ ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ 50MB ~ 500MB ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ถ„ํ• ๋œ ํ›„, ์ผ๋ฐ˜์ ์œผ๋กœ 16MB์ •๋„๋กœ ์••์ถ•์„ ํ•˜์—ฌ Micro-Partition ๋‹จ์œ„๋กœ ์ €์žฅํ•œ๋‹ค. ์••์ถ• ์‹œ์—๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹์— ๋”ฐ๋ผ GZIP, LZO, ZSTD์™€ ๊ฐ™์€ ๊ฐ ๋ฐ์ดํ„ฐ์— ๋งž๋Š” ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

Clustering Key

Clustering key ์ƒ์„ฑ

ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

CREATE TABLE my_table (
   column1 INTEGER,
   column2 STRING,
   column3 DATE
)
CLUSTER BY (column1, column2);

column1๊ณผ column2๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋กœ ์ง€์ •๋œ ๊ฒƒ์ด๋‹ค.

ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์•„๋ž˜ ์ฟผ๋ฆฌ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'MY_TABLE';


Clustering key ์„ ํƒ ์ „๋žต

ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค ์„ ํƒ ์ „๋žต์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ํ‚ค๋‹น ์ตœ๋Œ€ 3~4๊ฐœ์˜ ์ปฌ๋Ÿผ์„ ๊ถŒ์žฅํ•œ๋‹ค. ๊ทธ ์ด์ƒ ์ถ”๊ฐ€ํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค์˜ ์ด์ ๋ณด๋‹ค ๋น„์šฉ์ด ๋” ๋งŽ์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ปฌ๋Ÿผ ์ค‘ ํ™œ๋ฐœํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ์„ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋กœ ์„ ํƒํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ปฌ๋Ÿผ์˜ cardinality๊ฐ€ ๋„ˆ๋ฌด ๋†’์œผ๋ฉด(์ค‘๋ณต๋„๊ฐ€ ๋„ˆ๋ฌด ๋‚ฎ์œผ๋ฉด) ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋” ๋งŽ์€ ๋น„์šฉ์ด ๋“ค์–ด๊ฐ„๋‹ค. cardinality๊ฐ€ ๋„ˆ๋ฌด ๋‚ฎ์€(์ค‘๋ณต๋„๊ฐ€ ๋„ˆ๋ฌด ๋†’์€) ์ปฌ๋Ÿผ(ex: ์„ฑ๋ณ„)์€ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋กœ ์ ํ•ฉํ•œ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์—†๋‹ค.
  • ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋‹ค์ค‘ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ, ์ง€์ •ํ•˜๋Š” ์ปฌ๋Ÿผ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค์˜ ์ˆœ์„œ๋Š” cardinality๊ฐ€ ๋‚ฎ์€ ์ปฌ๋Ÿผ๋ถ€ํ„ฐ ๋†’์€ ์ปฌ๋Ÿผ์œผ๋กœ ์ •๋ ฌํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. cardinality๊ฐ€ ๋†’์€ ์ปฌ๋Ÿผ์„ ์•ž์— ๋ฐฐ์น˜ํ•  ๊ฒฝ์šฐ, ํ›„์ž์—ด์— ๋Œ€ํ•œ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํšจ์œจ์„ฑ์ด ๊ฐ์†Œํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


Pruning

Snowflake์—์„œ Pruning์€ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜๋กœ, ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฒ€์ƒ‰ํ•˜๋„๋ก ์„ ํƒ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

snowflake pruning

์œ„์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ์œ„ ํ…Œ์ด๋ธ”์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋Š” ID์™€ Date ์ด๋‹ค. Pruning์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

  1. where ์กฐ๊ฑด์ ˆ์— ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค์ธ date๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 11/2์ผ์€ ๋‚ ์งœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
  2. Service Layer๋Š” ๊ฐ Micro-partitions์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค์— ๋Œ€ํ•œ Min/Max ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด Min/Max ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ 11/2์ผ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” Micro-partitions๋งŒ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ์œ„ ๊ทธ๋ฆผ์—์„œ๋Š” 4๊ฐœ์˜ Micro-partitions ์ค‘ 2๊ฐœ๋งŒ ํ•ด๋‹น๋˜๋ฏ€๋กœ 2๊ฐœ๋งŒ ์Šค์บ”ํ•œ๋‹ค.
  3. ์Šค์บ”ํ•œ 2๊ฐœ์˜ Micro-partitions์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€, Pruning์€ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๊ฐ€ ์•„๋‹Œ ์ปฌ๋Ÿผ์„ WHERE ์กฐ๊ฑด์— ์‚ฌ์šฉํ•˜๋ฉด Pruning์„ ์ด์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๋ฌผ๋ก  WHERE ์กฐ๊ฑด์— ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์€ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ํ•„ํ„ฐ๋ง ๋“ฑ ๋‹ค๋ฅธ ์ตœ์ ํ™” ๊ธฐ์ˆ ์„ ์ด์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์‹คํ–‰ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ Pruning์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋ ค๋ฉด WHERE ์กฐ๊ฑด์—๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ด์ฒ˜๋Ÿผ, Pruning์€ ์กฐ๊ฑด์ ˆ์—์„œ ์ œ๊ณต๋œ ์กฐ๊ฑด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฒ€์ƒ‰ํ•จ์œผ๋กœ์จ ์ฟผ๋ฆฌ ์‹คํ–‰ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ๋ณ„๋„๋กœ Pruning์„ ๊ตฌํ˜„ํ•  ํ•„์š” ์—†์ด ์ตœ์ ํ™”๋œ ์ฟผ๋ฆฌ ์‹คํ–‰์„ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.


Micro-Partition์˜ ์žฅ์ 

์ด Micro-Partition ๋‹จ์œ„๋กœ ์ €์žฅํ•จ์œผ๋กœ ์ธํ•ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๋น ๋ฅธ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ : Micro-Partition์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ตœ์ ํ™”๋œ ์ž‘์€ ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๋ฉฐ, ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์…‹๋„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํšจ์œจ์ ์ธ ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌ : Micro-Partition์€ ์ž‘์€ ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์œผ๋กœ ๋ถ„ํ• ๋˜์–ด ์ €์žฅ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ž‘์€ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก ํ•˜์—ฌ ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ๋Ÿ‰์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์Šค์ผ€์ผ ์•„์›ƒ : Micro-Partition์€ ์ˆ˜ํ‰ ์Šค์ผ€์ผ ์•„์›ƒ์— ์ ํ•ฉํ•˜๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์˜ ์šฉ์ด์„ฑ : Micro-Partition์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•ด์ง€๋ฉฐ, ๋ฐ์ดํ„ฐ์…‹์˜ ์ผ๋ถ€๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋น„์šฉ ํšจ์œจ์„ฑ : Micro-Partition์€ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด Micro-Partition์— ๊ด€๋ จ๋œ Auto-Clustering, Re-Clustering์— ๋Œ€ํ•œ Speed Up๋ถ€๋ถ„์€ Service Layer ์žฅ์—์„œ ๋” ์ž์„ธํžˆ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.


Schema Detection & Evolution

Snowflake์—์„œ Schema Detection & Evolution์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์‹œ์— ์ž๋™์œผ๋กœ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ , ๊ธฐ์กด ํ…Œ์ด๋ธ”๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ์Šคํ‚ค๋งˆ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฑฑ์ • ์—†์ด ์Šคํ‚ค๋งˆ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

snowflake schema detection evolution

Snowflake์—์„œ Schema Detection & Evolution์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

  1. ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ๊ฐ์ง€
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒˆ๋กœ์šด ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋ฉด Snowflake๋Š” ์ž๋™์œผ๋กœ ์ด๋ฅผ ๊ฐ์ง€ํ•œ๋‹ค.
  2. ํ˜ธํ™˜์„ฑ ๋ถ„์„
    • Snowflake๋Š” ๋ณ€๊ฒฝ๋œ ์Šคํ‚ค๋งˆ๊ฐ€ ๊ธฐ์กด ํ…Œ์ด๋ธ”๊ณผ ํ˜ธํ™˜๋˜๋Š”์ง€ ๋ถ„์„ํ•œ๋‹ค. ์ด ๋•Œ, ํ˜ธํ™˜์„ฑ ๋ถ„์„์„ ์œ„ํ•ด ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ๋‚ด์—ญ๊ณผ ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ ์ •๋ณด๊ฐ€ ๋น„๊ต๋œ๋‹ค.
  3. ์Šคํ‚ค๋งˆ ์—…๋ฐ์ดํŠธ
    • ํ˜ธํ™˜์„ฑ ๋ถ„์„์ด ์™„๋ฃŒ๋˜๋ฉด, Snowflake๋Š” ๋ณ€๊ฒฝ๋œ ์Šคํ‚ค๋งˆ๋ฅผ ๊ธฐ์กด ํ…Œ์ด๋ธ”๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์ด ๋•Œ, ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•œ ์ฑ„๋กœ ์Šคํ‚ค๋งˆ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค.
  4. ์‚ฌ์šฉ์ž ์•Œ๋ฆผ
    • ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ์™„๋ฃŒ๋˜๋ฉด, Snowflake๋Š” ํ•ด๋‹น ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์•Œ๋ฆฐ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Schema Detection & Evolution์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ๋”์šฑ ์œ ์—ฐํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋”์šฑ ์‰ฝ๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ฌธ์ œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.


Time Travel & Fail Safe

๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์—์„œ Backup์ด๋‚˜ Snapshot์€ ๋งค์šฐ ์ค‘์š”ํ•˜๊ณ  ๋ฐ˜๋“œ์‹œ ํ•ด์•ผํ•˜๋Š” ์ž‘์—… ์ค‘ ํ•˜๋‚˜์ด๋‹ค. Snowflake์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ Snowflake ๋‚ด๋ถ€์—์„œ ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ด๋ ฅ์„ ๋ณด์กดํ•˜๊ณ , ์ด์ „ ์‹œ์ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๋ณต๊ตฌํ•˜๊ฑฐ๋‚˜ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” Time Travel ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

Time Travel์˜ ํ‘œ์ค€ ๋ณด์กด ๊ธฐ๊ฐ„์€ 1์ผ์ด๊ณ  ์ž๋™์œผ๋กœ ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ๋‹ค. Snowflake Enterprise Edition ์ด์ƒ์˜ ๊ฒฝ์šฐ ์ด ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ตœ๋Œ€ 90์ผ๊นŒ์ง€ ๋” ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ์ดํ›„ ์‹œ์Šคํ…œ ์˜ค๋ฅ˜ ๋ฐ ๊ธฐํƒ€ ๋ณด์•ˆ ์œ„๋ฐ˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” Fail Safe ๊ธฐ๊ฐ„์€ 7์ผ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋”ฐ๋กœ ๊ตฌ์„ฑ์„ ๋ถˆ๊ฐ€ํ•˜๋‹ค. Fail Safe๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ๋Š” ์™„๋ฃŒํ•˜๋Š”๋ฐ ๋ช‡ ์‹œ๊ฐ„์—์„œ ๋ฉฐ์น ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

snowflake time travel

์œ„ ๊ทธ๋ฆผ์—์„œ๋Š” Time Travel ๊ธฐ๊ฐ„์„ 90์ผ๋กœ ์„ค์ •ํ–ˆ๋‹ค. ์ด 90์ผ ๊ธฐ๊ฐ„๋™์•ˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ Time Travel์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•˜๋ฉฐ, Fail-Safe ๊ธฐ๋Šฅ์œผ๋กœ 90์ผ๋™์•ˆ์˜ ์ด์ „ ๋ฐ์ดํ„ฐ๋“ค์„ 90์ผ ์ดํ›„์— 7์ผ๋™์•ˆ ์ถ”๊ฐ€๋กœ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ Fail Safe ๊ธฐ๊ฐ„์—” ๊ณ ๊ฐ์ด ์ง์ ‘ ๋ณต์›์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , Snowflake์˜ ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ ์ „๋ฌธ๊ฐ€์— ์˜ํ•ด ๋ณต์›์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋”ฐ๋ผ์„œ, Fail-Safe๋Š” ๋ฐ์ดํ„ฐ ์†์‹ค์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ตœํ›„์˜ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์ด๋ฉฐ, Time Travel๊ณผ ๊ฐ™์ด ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์˜ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๋ช…์‹ฌํ•ด์•ผ ํ•œ๋‹ค.


Time Travel ๊ด€๋ จ ๋ช…๋ น์–ด

UNDROP

Time Travel์€ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ๊ธฐ๊ฐ„(Time Travel Duration)์„ ์ง€์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์กฐํšŒ

    • ์ด์ „ ์‹œ์ ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ์ ์˜ ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•˜์—ฌ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹

    • ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ ์‹œ๊ฐ„์œผ๋กœ๋ถ€ํ„ฐ 5๋ถ„ ์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ ค๋ฉด TIME_TRAVEL ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

      > SELECT * FROM my_table AT(OFFSET => -60*5);
      
  2. ํŠน์ • ์‹œ์ (Time Travel Timestamp)์˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ

    • ์ง€์ •ํ•œ ์‹œ์ ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹

      > SELECT * FROM my_table AT(TIMESTAMP => 'Fri, 01 May 2015 16:20:00 -0700'::timestamp_tz);
      
  3. ํŠน์ • Statement ID๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ

    • ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ์˜ Statement ID๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹

      Snowflake๋Š” ๊ฐ๊ฐ์˜ ์‹คํ–‰ํ–ˆ๋˜ ์ฟผ๋ฆฌ์— ๊ณ ์œ ํ•œ Statement ID๋ฅผ ๋ถ€์—ฌํ•˜๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ์ƒํƒœ ๋ฐ ๊ฒฐ๊ณผ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์ „์— ์‹คํ–‰ํ–ˆ๋˜ ์ฟผ๋ฆฌ๋“ค์˜ ID๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

      > select query_id, query_text, start_time
      from table(information_schema.query_history_by_session())
      order by start_time desc;
      

      ์—ฌ๊ธฐ์„œ ๋‚˜์˜จ query_id๋กœ ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „ ์ƒํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

      > SELECT * FROM my_table BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');
      

์ด๋ ‡๊ฒŒ ๋ถˆ๋Ÿฌ์˜จ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ ๋ถ„์„ ๋“ฑ์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


Time Travel ๊ธฐ๊ฐ„ ์„ค์ •

๊ณ„์ •, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์Šคํ‚ค๋งˆ ๋ฐ ํ…Œ์ด๋ธ”์˜ ๋ณด์กด ๊ธฐ๊ฐ„์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ALTER <object> ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ƒ์œ„ ๊ฐ์ฒด์˜ ๋ณด์กด ๊ธฐ๊ฐ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •๋˜์ง€ ์•Š์€ ๋ชจ๋“  ํ•˜์œ„ ์ˆ˜์ค€์˜ ๊ฐ์ฒด์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค. ์˜ˆ๋กœ ๊ฐ€์žฅ ๋†’์€ ๊ณ„์ • ์ˆ˜์ค€์—์„œ์˜ ๋ณด์กด ๊ธฐ๊ฐ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ช…์‹œ์  ๋ณด์กด ๊ธฐ๊ฐ„์ด ์—†๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์Šคํ‚ค๋งˆ ๋ฐ ํ…Œ์ด๋ธ”์ด ์ž๋™์œผ๋กœ ๊ณ„์ •์˜ ๋ณด์กด ๊ธฐ๊ฐ„์„ ์ƒ์†๋ฐ›๋Š”๋‹ค. ์•„๋ž˜๋Š” ํ…Œ์ด๋ธ”์˜ ๋ณด์กด ๊ธฐ๊ฐ„์„ ์ƒ์„ฑ ๋ฐ ๋ณ€๊ฒฝํ•˜๋Š” ์ฟผ๋ฆฌ์ด๋‹ค.

> CREATE TABLE mytable(col1 NUMBER, col2 DATE) DATA_RETENTION_TIME_IN_DAYS=90;
> ALTER TABLE mytable SET DATA_RETENTION_TIME_IN_DAYS=30;


์ด๋Ÿฌํ•œ Time Travel ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•œ ์‚ฌ์šฉ์ž, ๋ณ€๊ฒฝ ๋‚ด์šฉ, ๋ณ€๊ฒฝ ์‹œ๊ฐ„ ๋“ฑ์˜ ์ด๋ ฅ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€ ๋ฐ ๋ฐ์ดํ„ฐ ๋ถ„์„์— ์žˆ์–ด์„œ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๋น„๊ตํ•˜๊ฑฐ๋‚˜ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, Time Travel ๊ธฐ๋Šฅ์€ ์ด์ „ ์‹œ์ ์˜ ๋ฐ์ดํ„ฐ๋Š” ๋งˆ์ดํฌ๋กœ ํŒŒํ‹ฐ์…˜ ๋‚ด๋ถ€์— ํ˜„์žฌ ์‹œ์ ์˜ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ €์žฅ๋˜๋ฏ€๋กœ, ๊ธฐ๋ณธ ์„ค์ •์ธ 1์ผ๋กœ ์‚ฌ์šฉ ์‹œ ๋ณ„๋„์˜ ์ €์žฅ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋น„์šฉ์„ ์ถ”๊ฐ€๋กœ ์ง€๋ถˆํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.


๊ณผ๊ธˆ

Time Travel์— ๋Œ€ํ•œ ๊ณผ๊ธˆ์€ ์ด์ „ ์ƒํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ์œ ์ง€ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

Snowflake์—์„œ๋Š” Time Travel์— ๋Œ€ํ•œ ๋ณด๊ด€ ๊ธฐ๊ฐ„์„ ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๋ณด๊ด€ ๊ธฐ๊ฐ„์— ๋”ฐ๋ผ ๊ณผ๊ธˆ์ด ๊ฒฐ์ •๋œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Snowflake์€ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ 1์ผ๊ฐ„ ๋ณด๊ด€ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, 1์ผ ์ด๋‚ด์˜ Time Travel์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์ธ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, 1์ผ ์ด์ƒ์˜ Time Travel์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Snowflake์—์„œ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. Snowflake๋Š” ์—…๋ฐ์ดํŠธ๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์›ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋งŒ์„ ์œ ์ง€ํ•˜์—ฌ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ์— ํ•„์š”ํ•œ ์Šคํ† ๋ฆฌ์ง€ ๊ณต๊ฐ„์„ ์ตœ์†Œํ™” ํ•œ๋‹ค. ํ…Œ์ด๋ธ”์ด ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ „์ฒด ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜์—ฌ ์œ ์ง€ํ•œ๋‹ค. ์ด๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์š”๊ธˆ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ ์‹œ์ ๋ถ€ํ„ฐ 24์‹œ๊ฐ„๋งˆ๋‹ค ๊ณ„์‚ฐ๋œ๋‹ค.


Zero-Copy Cloning

Snowflake์˜ zero copy cloning์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต์ œ๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•  ๋•Œ ๋ณต์ œํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์ œ๋กœ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ , ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋งŒ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ์˜ ๋ณต์ œ ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๊ณ  ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ์กด์—๋Š” DEV ํ™˜๊ฒฝ ์ƒ์„ฑ์„ ์œ„ํ•ด ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•˜๋ฉด ๋ณต์ œํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ์ƒˆ๋กœ์šด ์œ„์น˜์— ๋‹ค์‹œ ์“ฐ๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๊ณผ ๋””์Šคํฌ ๊ณต๊ฐ„์ด ์†Œ์š”๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ zero copy cloning์€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ๊ธฐ์กด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋งŒ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„์™€ ๊ณต๊ฐ„๋ฉด์—์„œ ์ด์ ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

๋˜ํ•œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ zero copy cloning์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ํด๋ก ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ก ์€ ์›๋ณธ ๋ฐ์ดํ„ฐ์™€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜์ง€๋งŒ, ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ก ์€ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋™์‹œ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

DEV ํ™˜๊ฒฝ ๊ตฌ์ถ•

๋‹ค์Œ ๊ทธ๋ฆผ์€ ์›๋ณธ ๋ฐ์ดํ„ฐ XXX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ User2๊ฐ€ DEV ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. ์ƒ์„ฑ, ์กฐํšŒ, ๋ณ€๊ฒฝ์˜ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

snowflake zero-copy cloning

ํด๋ก  ํ…Œ์ด๋ธ” ์ƒ์„ฑ

Snowflake์—์„œ ํด๋ก  ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. ์›๋ณธ ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•˜๊ณ , CREATE TABLE ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋ฉด์„œ CLONE ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

> CREATE OR REPLACE TABLE ZZZ CLONE XXX;

์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ํด๋ก  ํ…Œ์ด๋ธ”์€ ์›๋ณธ ํ…Œ์ด๋ธ”๊ณผ ๋™์ผํ•œ ์Šคํ‚ค๋งˆ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋ฐ์ดํ„ฐ๋„ ์›๋ณธ ํ…Œ์ด๋ธ”๊ณผ ๋™์ผํ•˜๋‹ค.


ํด๋ก  ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ

์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์›๋ณธ ํ…Œ์ด๋ธ”์ธ XXX๋ฅผ CREATE ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ก  ํ…Œ์ด๋ธ”์ธ ZZZ๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค. ๋งŒ์ผ ์—ฌ๊ธฐ์„œ SELECT * FORM ZZZ; ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ํด๋ก  ํ…Œ์ด๋ธ”์ธ ZZZ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋Š” XXX์—์„œ ๊ฐ€์ ธ์™€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ZZZ ํ…Œ์ด๋ธ”์€ XXX ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ฐธ์กฐ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ clone ์ดํ›„์— ๋ณ€๊ฒฝ๋ถ„์ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋ณ€๊ฒฝ๋ถ„์€ ์›๋ณธ ํ…Œ์ด๋ธ”๊ณผ๋Š” ๋…๋ฆฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋ณ€๊ฒฝ๋ถ„์„ ์ ์šฉํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.


ํด๋ก  ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ

ํด๋ก  ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ ๋ฐ ์Šคํ‚ค๋งˆ๋ฅผ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜์ ์ธ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค.

> INSERT INTO ZZZ (col1, col2, col3) VALUES (value1, value2, value3);
> UPDATE ZZZ SET col1 = 'a';
> alter table ZZZ drop column col1;

์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ ๋ฐ ์Šคํ‚ค๋งˆ๋Š” ์ƒˆ๋กœ์šด ์Šคํ† ๋ฆฌ์ง€ ํด๋ก  ํ…Œ์ด๋ธ”์—๋งŒ ์ €์žฅ๋˜๋ฉฐ, ์›๋ณธ ํ…Œ์ด๋ธ”์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.


์žฅ์ 

์ •๋ฆฌํ•˜์ž๋ฉด Zero-Copy Clones ๊ธฐ๋Šฅ์˜ ์žฅ์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๋™์ผํ•œ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ Pointer(์ฐธ์กฐ) ๋ณต์‚ฌ
  • ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ๋กœ CREATE ... CLONE ...์ฟผ๋ฆฌ ํ•˜๋‚˜๋กœ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•
  • Cloning์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์Šคํ† ๋ฆฌ์ง€ ๋ถˆํ•„์š”
  • ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์ €์žฅ์†Œ ๊ณผ๊ธˆ ๋ฐœ์ƒ

Leave a comment