[Snowflake Partner Technical Bootcamp] 2. Storage Layer
Snowflake - Storage Layer
Compute Layer์ ์์ ํ ๋ถ๋ฆฌ๋์ด ์๋ ํตํฉ/๋จ์ผ ์ ์ฅ์ ๊ณ์ธต์ด๋ค. Snowflake์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ centralized๋์ด ์ด 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๋ก ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ๋์ง ์์๋ณด์.
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.*';
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ธ๋ถ ํด๋ผ์ฐ๋ ์ ์ฅ์๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ก๋, ์ธ๋ก๋ ํ ์ ์๋ค.
Continuous
S3๋ ๋ฐ์ดํฐ์ ์ง์์ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ด๋ฒคํธ ์๋ฆผ ์ต์ ์ ์ฌ์ฉํ์ฌ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ฉด SQS์ notification์ ๋จ๊ธธ ์ ์๋๋ฐ, ์ด notification์ ๋ฐ๋ผ๋ณด๋ฉฐ Snowpipe service๋ก ๋ฐ์ดํฐ๋ฅผ snowflake ์ ์ฌ ๊ฐ๋ฅํ๋ค.
Snowpipe์ ๋ํ ์ค๋ช ์ Service Layer ์ฅ์์ ์์ธํ ๋ค๋ฃฐ ๊ฒ์ด๋ค.
4. Kafka Connector
Kafka Connector๋ Apache Kafka์ Snowflake ๊ฐ์ ๋ฐ์ดํฐ ์ ์ก์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๋๊ตฌ๋ก, ํํธ๋์ฌ์ ETL Tool ๋ค์์ผ๋ก ๊ถ์ฅํ๋ Connector ์ด๋ค.
Kafka Connector๋ ํ ์ด๋ธ ์ด๋ฆ๊ณผ ์คํค๋ง, ๋ฐ์ดํฐ ํ์ , ์ธ๋ฑ์ค ๋ฑ์ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ์ง์ ํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๋ Snowflake ํ ์ด๋ธ์ ์์ ์ ์๊ตฌ์ ๋ง๊ฒ ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋์ ํจ์จ์ฑ์ ํฅ์์ํฌ ์ ์๋ค.
์ ๊ทธ๋ฆผ์ ๋ํ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
-
์ดํ๋ฆฌ์ผ์ด์ ์ด JSON ๋๋ Avro ๋ ์ฝ๋๋ฅผ Kafka ํด๋ฌ์คํฐ์ ๊ฒ์ํ๋ค. ๋ ์ฝ๋๋ 1๊ฐ ์ด์์ ํํฐ์ ์ผ๋ก ๋ถํ ๋๋ค.
-
๋ฐ์ดํฐ ์์ง : Kafka Connector๋ Kafka ํ ํฝ์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ค.
๋ฐ์ดํฐ ๋ฒํผ๋ง : ์์ง๋ ๋ฐ์ดํฐ๋ ๋ฒํผ๋ง์ ์ํด ์ผ์์ ์ธ ์คํ ๋ฆฌ์ง ์์ญ์ ์ ์ฅ๋๋ค. ์ด๋, ๋ฒํผ์ ํฌ๊ธฐ๋ ์ฌ์ฉ์๊ฐ ์ค์ ํ ์ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ 100MB์ด๋ค.
ํ์ผ ์ ์ฌ : ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐจ๊ฑฐ๋ ๋ก๋ฉ ์์ ์ด ํธ๋ฆฌ๊ฑฐ๋๋ฉด, ๋ฒํผ์ ์๋ ๋ฐ์ดํฐ๋ ํ์ผ๋ก Topic๊ณผ Partition๋ณ๋ก ์์ฑ๋ Internal Stage์ ์ ์ฌ๋๋ค.
-
Internal Stage์ ํ์ผ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ํ, Topic๊ณผ Partition๋ณ๋ก Snowpipe๊ฐ ์์ฑ๋์ด ๋ฐ์ดํฐ๋ฅผ Internal Stage์์ ์ฝ์ด์ Snowflake Storage์ ์ ์ฌํ๋ค.
-
Kafka Connector๋ Snowpipe๋ฅผ ๋ชจ๋ํฐ๋ง ํ์ฌ ํ์ผ ๋ฐ์ดํฐ๊ฐ ํ ์ด๋ธ์ ์ ์ฌ๋ ๊ฒ์ ํ์ธํ ํ, Internal Stage์ ํ์ผ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค. ์คํจ๋ก ์ธํด ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ์ ์๋ ๊ฒฝ์ฐ, Kafka Connector๋ ํ์ผ์ Internal Stage๋ก ์ด๋ํ๊ณ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์์ฑํ๋ค.
-
์ปค๋ฅํฐ๋ 2~4 ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ๋ค.
5~8. Other Connector
๊ฐ ์๋น์ค๋ค์ ํด๋น ์๋น์ค์ ๋ํ Snowflake Connector๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ Snowflake Storage๋ก ์ ์ฌ ๊ฐ๋ฅํ๋ค.
Snowflake๋ ๊ณ์ํ์ฌ ๊ฐ ์๋น์ค์ ๋ํ Connector ์ง์์ ๋ํ๊ฐ๊ณ ์๋ค.
Data Loading In Snowflake Storage
Structured & Semi-structured data
Snowflake๋ ์ ํ ๋ฐ์ดํฐ ๋ฟ๋ง ์๋๋ผ ๋ฐ์ ํ ๋ฐ์ดํฐ ์ ํ์ ๋ํด์๋ ์ต์ ํ๋ ์ ์ฅ์๋ฅผ ์ง์ํ๋ค.
์ ํ ๋ฐ์ดํฐ
- ๋ฐ์ดํฐ ๋ก๋ ์, ํ ์ด๋ธ ์ปฌ๋ผ์ 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-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์ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ธฐ์ ์ค ํ๋๋ก, ์ฟผ๋ฆฌ ์คํ ์ ํ์ํ ๋ฐ์ดํฐ๋ง ๊ฒ์ํ๋๋ก ์ ํ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋งํ๋ค. ์ด๋ฅผ ํตํด ์ฟผ๋ฆฌ ์ฒ๋ฆฌ ์๋๋ฅผ ํฅ์์ํฌ ์ ์์ผ๋ฉฐ, ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ ๋น์ฉ์ ์ค์ผ ์ ์๋ค.
์์ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ํ์. ์ ํ ์ด๋ธ์ ํด๋ฌ์คํฐ๋ง ํค๋ ID์ Date ์ด๋ค. Pruning์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ํ๋๋ค.
- where ์กฐ๊ฑด์ ์ ํด๋ฌ์คํฐ๋ง ํค์ธ date๋ฅผ ์ฌ์ฉํ์ฌ 11/2์ผ์ ๋ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ค.
- Service Layer๋ ๊ฐ Micro-partitions์ ํด๋ฌ์คํฐ๋ง ํค์ ๋ํ Min/Max ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค. ์ด Min/Max ๊ฐ์ ์ฌ์ฉํ์ฌ 11/2์ผ์ ํด๋นํ๋ ๋ฐ์ดํฐ๊ฐ ์๋ Micro-partitions๋ง ๊ฒ์ํ๋ค. ์ ๊ทธ๋ฆผ์์๋ 4๊ฐ์ Micro-partitions ์ค 2๊ฐ๋ง ํด๋น๋๋ฏ๋ก 2๊ฐ๋ง ์ค์บํ๋ค.
- ์ค์บํ 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๋ ์๋์ผ๋ก ์ด๋ฅผ ๊ฐ์งํ๋ค.
-
ํธํ์ฑ ๋ถ์
- Snowflake๋ ๋ณ๊ฒฝ๋ ์คํค๋ง๊ฐ ๊ธฐ์กด ํ ์ด๋ธ๊ณผ ํธํ๋๋์ง ๋ถ์ํ๋ค. ์ด ๋, ํธํ์ฑ ๋ถ์์ ์ํด ์คํค๋ง ๋ณ๊ฒฝ ๋ด์ญ๊ณผ ํ ์ด๋ธ ์คํค๋ง ์ ๋ณด๊ฐ ๋น๊ต๋๋ค.
-
์คํค๋ง ์ ๋ฐ์ดํธ
- ํธํ์ฑ ๋ถ์์ด ์๋ฃ๋๋ฉด, Snowflake๋ ๋ณ๊ฒฝ๋ ์คํค๋ง๋ฅผ ๊ธฐ์กด ํ ์ด๋ธ๊ณผ ํธํ๋๋๋ก ์๋์ผ๋ก ์ ๋ฐ์ดํธํ๋ค. ์ด ๋, ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ฑ๋ก ์คํค๋ง๋ฅผ ์ ๋ฐ์ดํธํ๋ฏ๋ก, ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ๋ณด์ฅ๋๋ค.
-
์ฌ์ฉ์ ์๋ฆผ
- ์คํค๋ง ๋ณ๊ฒฝ์ด ์๋ฃ๋๋ฉด, 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๋ฅผ ํตํ ๋ฐ์ดํฐ ๋ณต๊ตฌ๋ ์๋ฃํ๋๋ฐ ๋ช ์๊ฐ์์ ๋ฉฐ์น ์ด ๊ฑธ๋ฆด ์ ์๋ค.
์ ๊ทธ๋ฆผ์์๋ Time Travel ๊ธฐ๊ฐ์ 90์ผ๋ก ์ค์ ํ๋ค. ์ด 90์ผ ๊ธฐ๊ฐ๋์์ ๋ฐ์ดํฐ๋ฅผ Time Travel์ ์ฌ์ฉํ์ฌ ๋ณต๊ตฌ ๊ฐ๋ฅํ๋ฉฐ, Fail-Safe ๊ธฐ๋ฅ์ผ๋ก 90์ผ๋์์ ์ด์ ๋ฐ์ดํฐ๋ค์ 90์ผ ์ดํ์ 7์ผ๋์ ์ถ๊ฐ๋ก ๋ณต๊ตฌํ ์ ์๋ค. ๋จ Fail Safe ๊ธฐ๊ฐ์ ๊ณ ๊ฐ์ด ์ง์ ๋ณต์์ด ๋ถ๊ฐ๋ฅํ๊ณ , Snowflake์ ๋ฐ์ดํฐ ๋ณต๊ตฌ ์ ๋ฌธ๊ฐ์ ์ํด ๋ณต์์ด ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์, Fail-Safe๋ ๋ฐ์ดํฐ ์์ค์ ์ต์ํํ๊ณ ๋ฐ์ดํฐ์ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ์ตํ์ ๋ณดํธ ๊ธฐ๋ฅ์ด๋ฉฐ, Time Travel๊ณผ ๊ฐ์ด ๊ณผ๊ฑฐ ๋ฐ์ดํฐ์ ์ก์ธ์คํ๊ธฐ ์ํ ๋ชฉ์ ์ ๊ธฐ๋ฅ์ด ์๋๋ฉฐ, ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌํ๋ ๊ฒ์ ์๋๋ผ๋ ์ ์ ๋ช ์ฌํด์ผ ํ๋ค.
Time Travel ๊ด๋ จ ๋ช ๋ น์ด
UNDROP
Time Travel์ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ด์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ค.
-
๊ธฐ๊ฐ(Time Travel Duration)์ ์ง์ ํ์ฌ ๋ฐ์ดํฐ ์กฐํ
-
์ด์ ์์ ์ผ๋ก ๋์๊ฐ๊ธฐ ์ํด ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ์์ ์ ๊ธฐ๊ฐ์ ์ง์ ํ์ฌ ์กฐํํ๋ ๋ฐฉ์
-
์๋ฅผ ๋ค์ด, ํ์ฌ ์๊ฐ์ผ๋ก๋ถํฐ 5๋ถ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ค๋ฉด
TIME_TRAVEL
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค.> SELECT * FROM my_table AT(OFFSET => -60*5);
-
-
ํน์ ์์ (Time Travel Timestamp)์ ๋ฐ์ดํฐ ์กฐํ
-
์ง์ ํ ์์ ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์กฐํํ๋ ๋ฐฉ์
> SELECT * FROM my_table AT(TIMESTAMP => 'Fri, 01 May 2015 16:20:00 -0700'::timestamp_tz);
-
-
ํน์ 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์์ ํด๋ก ํ
์ด๋ธ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค. ์๋ณธ ํ
์ด๋ธ์ ์ ํํ๊ณ , 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