개요
2024.06.18-[Snowflake] 데이터베이스, 스키마에서 Snowflake에서 사용하는 데이터베이스와 스키마에 대해서 살펴보았다.
이번 글에서는 실제로 데이터를 저장하는 테이블에 대해서 알아본다.
테이블
Snowflake의 데이터는 논리적 열과 행으로 구성된 데이터베이스 테이블에 저장된다.
테이블의 물리적 구조에는 마이크로 파티션, 데이터 클러스터링 개념이 사용되는데, 각각의 개념은 다음과 같다.
마이크로 파티션
Snowflake 내 데이터가 분할되어 저장되는 단위로, 각 마이크로 파티션에는 50MB에서 500MB 사이 용량의 데이터가 포함된다. Snowflake에서 유지 관리하기 때문에 사용자가 직접 관리할 필요가 없다.
마이크로 파티션은 용량이 적어 효율적으로 DML을 수행할 수 있고, 빠르게 쿼리를 수행할 수 있도록 세분화된 정리를 가능하게 한다. 또한 열은 마이크로 파티션 내의 columnar storage에 독립적으로 저장되어 개별 열을 효율적으로 스캔할 수 있다.
데이터 클러스터링
정렬되지 않은 데이터는 쿼리 성능에 영향을 미칠 수 있기 때문에 테이블에 저장된 데이터는 날짜, 리전에 따라 정렬된다.
Snowflake에서는 데이터가 테이블에 삽입되거나 로드되면서 클러스터링 메타데이터가 수집되고, 생성된 마이크로 파티션에 대해 기록된다. 이후 Snowflake는 클러스터링 정보를 활용해 쿼리 수행 중 불필요한 마이크로 파티션의 스캔을 방지하고, 열을 참조하는 쿼리의 성능을 개선한다.
아래 그림은 날짜별로 정렬된 4개 컬럼이 있는 Snowflake 테이블을 나타낸 것이다.
테이블은 4개의 마이크로 파티션에 저장된 24개의 행으로 구성된다. 데이터는 각 마이크로 파티션에 균등하게 분할되며, 열 별로 정렬된다.
일단은 효율적으로 쿼리를 수행하기 위해 도입된 개념이라는 정도만 이해해도 될 것 같다.
테이블 생성
테이블은 워크시트에서 CREATE OR REPLACE 구문을 사용하여 생성할 수 있다.
CREATE OR REPLACE TABLE database.schema.table (
col type,
col type
);
-- 예시
CREATE OR REPLACE TABLE GARDEN_PLANTS.VEGGIES.ROOT_DEPTH (
ROOT_DEPTH_ID number(1),
ROOT_DEPTH_CODE text(1),
ROOT_DEPTH_NAME text(7),
UNIT_OF_MEASURE text(2),
RANGE_MIN number(2),
RANGE_MAX number(2)
);
참고로 워크시트에서는 쿼리를 실행할 데이터베이스와 스키마를 지정할 수 있다. 쿼리를 지정할 때 잘못 지정되지 않았는지 확인하고, 가능하면 테이블의 절대 경로를 지정하는 것이 좋아보인다.
데이터 추가
INSERT 문을 사용하여 데이터를 추가한다.
INSERT INTO
GARDEN_PLANTS.VEGGIES.ROOT_DEPTH (
ROOT_DEPTH_ID,
ROOT_DEPTH_CODE,
ROOT_DEPTH_NAME,
UNIT_OF_MEASURE,
RANGE_MIN,
RANGE_MAX
)
values
(1, 'S', 'Shallow', 'cm', 30, 45),
(2, 'M', 'Medium', 'cm', 45, 60),
(3, 'D', 'Deep', 'cm', 60, 90);
데이터 조회
SELECT 문으로 테이블 내 저장된 데이터를 확인하거나 데이터 미리 보기 기능을 사용할 수 있다.
SELECT 문
SELECT
*
FROM
GARDEN_PLANTS.VEGGIES.ROOT_DEPTH;
데이터 미리보기
워크시트 왼쪽의 객체 선택기에서 데이터를 확인할 테이블을 선택하면 아래에 테이블 정보를 확인할 수 있다.
해당 공간을 잘 보면 돋보기 버튼이 있는데 해당 버튼이 데이터 미리 보기 기능이다. 버튼을 클릭하면 아래와 같이 테이블에 저장된 데이터를 확인할 수 있다.
이 외 다른 작업은 SQL만 간단히 정리한다.
데이터 삭제
delete from root_depth
where root_depth_id = 9;
데이터 갱신
update root_depth
set root_depth_id = 7
where root_depth_id = 9;
테이블 비우기
truncate table root_depth;
참고 문서
https://docs.snowflake.com/ko/user-guide/tables-micro-partitions