CREATE INTERACTIVE TABLE
CREATE INTERACTIVE TABLE
현재/지정한 스키마에 새 인터랙티브 테이블(interactive table)을 만들거나 기존 테이블을 교체하는 명령이에요. 인터랙티브 테이블은 저지연·인터랙티브 쿼리에 최적화되어 있으며, 인터랙티브 웨어하우스로 쿼리할 때 최상의 성능을 제공해요.
출처: 문서
본문
현재/지정한 스키마에 새 인터랙티브 테이블을 만들거나 기존 테이블을 교체해요. 인터랙티브 테이블은 저지연·인터랙티브 쿼리에 최적화되어 있으며, 인터랙티브 웨어하우스로 쿼리할 때 최상의 성능을 제공해요.
인터랙티브 테이블은 표준 테이블보다 더 제한된 SQL 작업 집합을 지원하며, 대시보드와 데이터 기반 API 같은 고동시성·실시간 쿼리 워크로드를 위해 설계됐어요.
참고: 인터랙티브 테이블을 만들 때 가장 시간에 민감한 쿼리의 WHERE 절에 사용되는 하나 이상의 컬럼에 CLUSTER BY 절을 정의해야 해요.
다음 CREATE INTERACTIVE TABLE 변형도 사용할 수 있어요.
- 변형 구문: 정적 인터랙티브 테이블 (쿼리에서 채워지는 정적 인터랙티브 테이블 생성)
- 변형 구문: 동적 인터랙티브 테이블 (자동 새로 고침이 있는 동적 인터랙티브 테이블 생성)
표준 Snowflake 테이블에 대한 전체 CREATE TABLE 구문은 CREATE TABLE을 참고해요.
💡 팁: 인터랙티브 테이블을 만들고 사용하기 전에 제한 사항과 사용 사례에 익숙해져야 해요. 인터랙티브 테이블은 선택적 WHERE 절이 있는 단순 SELECT 문에 가장 잘 작동해요.
함께 보기: CREATE WAREHOUSE, ALTER WAREHOUSE, SHOW INTERACTIVE TABLES, SHOW TABLES, SHOW WAREHOUSES, DROP TABLE
구문 (Syntax)
CREATE [ OR REPLACE ] INTERACTIVE TABLE [ IF NOT EXISTS ] <table_name>
(
<col_name> <col_type>
[ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
[ , <col_name> <col_type> [ ... ] ]
)
CLUSTER BY ( <expr> [ , <expr> , ... ] )
[ TARGET_LAG = '<num> { seconds | minutes | hours | days }' ]
[ WAREHOUSE = <warehouse_name> ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] AGGREGATION POLICY <policy_name> [ ENTITY KEY ( <col_name> [ , <col_name> ... ] ) ] ]
[ [ WITH ] JOIN POLICY <policy_name> [ ALLOWED JOIN KEYS ( <col_name> [ , ... ] ) ] ]
[ [ WITH ] STORAGE LIFECYCLE POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
AS <query>
필수 매개변수 (Required parameters)
table_name
인터랙티브 테이블의 식별자(즉 이름)를 지정하며, 테이블이 만들어지는 스키마 안에서 고유해야 해요.
또한 식별자는 반드시 알파벳 문자로 시작해야 하며, 전체 식별자 문자열이 큰따옴표로 묶이지 않는 한 공백이나 특수 문자를 포함할 수 없어요 (예: "My object"). 큰따옴표로 묶인 식별자는 대소문자를 구분해요.
자세한 내용은 식별자 요구 사항(Identifier requirements)을 참고해요.
CLUSTER BY ( expr [ , expr , ... ] )
테이블에서 하나 이상의 컬럼 또는 컬럼 표현식을 클러스터링 키로 지정해요. 가장 시간에 민감한 쿼리의 WHERE 절에 사용되는 클러스터링 컬럼을 선택해요. 이것은 쿼리 성능에 크게 영향을 미쳐요.
클러스터링 키는 CLUSTER BY 절의 모든 컬럼에 걸쳐 총 1KB까지 사용할 수 있어요.
효과적인 클러스터링 키 선택에 대한 자세한 내용은 클러스터링 키와 클러스터링 테이블(Clustering Keys & Clustered Tables)을 참고해요.
AS query
인터랙티브 테이블을 채우는 SELECT 문을 지정해요. 이 쿼리는 다른 매개변수를 포함한 여부와 관계없이 CREATE INTERACTIVE TABLE 문에서 마지막에 지정해야 해요.
쿼리는 CREATE TABLE AS SELECT(CTAS) 패턴을 따르며 인터랙티브 테이블의 데이터와 스키마를 정의해요.
col_name
컬럼 식별자(즉 이름)를 지정해요. 컬럼 식별자는 반드시 알파벳 문자로 시작해야 하며, 전체 식별자 문자열이 큰따옴표로 묶이지 않는 한 공백이나 특수 문자를 포함할 수 없어요.
자세한 내용은 식별자 요구 사항(Identifier requirements)을 참고해요.
col_type
컬럼의 데이터 유형을 지정해요.
테이블 컬럼에 지정할 수 있는 데이터 유형에 대한 자세한 내용은 SQL 데이터 유형 참조(SQL data types reference)를 참고해요.
선택 매개변수 (Optional parameters)
MASKING POLICY policy_name
컬럼에 설정할 마스킹 정책(masking policy)을 지정해요.
USING ( col_name , cond_col_1 ... )
조건부 마스킹 정책 SQL 표현식에 전달할 인자를 지정해요.
목록의 첫 번째 컬럼은 데이터를 마스킹하거나 토큰화할 정책 조건의 컬럼을 지정하며, 마스킹 정책이 설정된 컬럼과 일치해야 해요.
추가 컬럼은 첫 번째 컬럼에 대한 쿼리가 이루어질 때 쿼리 결과의 각 행에서 데이터를 마스킹할지 토큰화할지 결정하기 위해 평가할 컬럼을 지정해요.
USING 절을 생략하면 Snowflake는 조건부 마스킹 정책을 일반 마스킹 정책으로 취급해요.
OR REPLACE
스키마에 이미 있으면 인터랙티브 테이블을 교체하도록 지정해요. 이것은 기존 테이블에 DROP TABLE을 사용한 뒤 같은 이름으로 새 테이블을 만드는 것과 동일해요.
IF NOT EXISTS
스키마에 이미 존재하지 않을 때만 인터랙티브 테이블을 만들도록 지정해요. 같은 이름의 테이블이 이미 있으면 문이 새 테이블을 만들지 않고 성공해요.
참고: OR REPLACE와 IF NOT EXISTS 절은 서로 배타적이며 같은 문에서 둘 다 사용할 수 없어요.
TARGET_LAG = 'num { seconds | minutes | hours | days }'
인터랙티브 테이블의 자동 새로 고침에 대한 최대 지연 시간을 지정해요. 지정하면 인터랙티브 테이블이 동적 인터랙티브 테이블이 되며, 소스 데이터의 지정된 지연 시간 안에 머물도록 자동으로 새로 고쳐져요.
- 최소값은 60초(1분)예요.
- 단위를 지정하지 않으면 숫자가 초를 나타내요.
- TARGET_LAG를 지정하지 않으면 테이블이 정적 인터랙티브 테이블로 생성돼요.
- TARGET_LAG를 지정하면 WAREHOUSE 매개변수도 필요해요.
WAREHOUSE = warehouse_name
TARGET_LAG를 지정할 때 필요해요. TARGET_LAG가 설정될 때 새로 고침 작업에 사용되는 표준 웨어하우스를 지정해요. 이것은 인터랙티브 웨어하우스가 아닌 표준 웨어하우스여야 해요.
COMMENT = 'string_literal'
인터랙티브 테이블에 대한 설명(comment)을 지정해요.
TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )
태그 이름과 태그 문자열 값을 지정해요.
태그 값은 항상 문자열이며, 태그 값의 최대 문자 수는 256이에요.
문에서 태그를 지정하는 방법에 대한 정보는 태그 할당량(Tag quotas)을 참고해요.
ROW ACCESS POLICY policy_name ON ( col_name [ , col_name ... ] )
테이블에 설정할 행 접근 정책(row access policy)을 지정해요.
이 매개변수는 CREATE OR ALTER 변형 구문에서 지원되지 않아요.
AGGREGATION POLICY policy_name [ ENTITY KEY ( col_name [ , col_name ... ] ) ]
테이블에 설정할 집계 정책(aggregation policy)을 지정해요. 테이블에 하나 이상의 집계 정책을 적용할 수 있어요.
선택적 ENTITY KEY 매개변수로 테이블 안의 엔티티를 고유하게 식별하는 컬럼을 정의해요. 자세한 내용은 집계 정책으로 엔티티 수준 프라이버시 구현(Implementing entity-level privacy with aggregation policies)을 참고해요. 집계 정책에 대해 하나 이상의 엔티티 키를 지정할 수 있어요.
JOIN POLICY policy_name [ ALLOWED JOIN KEYS ( col_name [ , ... ] ) ]
테이블에 설정할 조인 정책(join policy)을 지정해요.
선택적 ALLOWED JOIN KEYS 매개변수로 이 정책이 적용 중일 때 조인 컬럼으로 사용할 수 있는 컬럼을 정의해요. 자세한 내용은 조인 정책(Join policies)을 참고해요.
이 매개변수는 CREATE OR ALTER 변형 구문에서 지원되지 않아요.
STORAGE LIFECYCLE POLICY policy_name ON ( col_name [ , col_name ... ] )
테이블에 연결할 스토리지 수명주기 정책(storage lifecycle policy)을 지정해요.
ON 절에 지정된 컬럼은 정책 함수 시그니처의 인자 수와 데이터 유형과 일치해야 해요. Snowflake는 이 컬럼들을 사용해 정책 표현식을 평가하고 어떤 행을 보관(archive)하거나 만료(expire)할지 결정해요.
⚠️ 중요: 보관 스토리지 정책을 테이블에 연결하면 테이블이 수명 동안 지정된 보관 티어에 영구적으로 할당돼요. 새 정책을 적용해 보관 티어를 변경할 수 없어요. 예를 들어 COOL 보관 티어로 만든 정책을 ALTER TABLE…DROP STORAGE LIFECYCLE POLICY로 지정한 뒤 COLD 보관 티어로 만든 정책을 추가하도록 테이블을 수정할 수 없어요. 테이블의 보관 티어를 변경하려면 Snowflake 지원에 현재 보관된 데이터의 삭제를 요청해요. 추가 고려 사항은 보관 스토리지 정책(Archival storage policies)을 참고해요.
스토리지 수명주기 정책 만들기·관리에 대한 자세한 내용은 스토리지 수명주기 정책 만들기와 관리(Create and manage storage lifecycle policies)를 참고해요.
이 매개변수는 CREATE OR ALTER 변형 구문에서 지원되지 않아요.
접근 제어 요구 사항 (Access control requirements)
이 작업을 실행하는 데 사용하는 역할(role)은 최소한 다음 권한을 가져야 해요.
| 권한 (Privilege) | 객체 (Object) | 비고 |
|---|---|---|
| CREATE INTERACTIVE TABLE | Schema | 스키마에 인터랙티브 테이블을 만드는 데 필요해요. |
| SELECT | Table, external table, view | AS SELECT 절의 쿼리된 테이블 및/또는 뷰에 필요해요. |
| APPLY | Masking policy, row access policy, tag, storage lifecycle policy | 테이블을 만들 때 마스킹 정책·행 접근 정책·객체 태그·스토리지 수명주기 정책 또는 이 거버넌스 기능들의 조합을 적용할 때만 필요해요. |
| USAGE | Database, Schema | 인터랙티브 테이블을 포함하는 데이터베이스와 스키마에 필요해요. |
| USAGE | Warehouse | WAREHOUSE 매개변수에 지정된 웨어하우스에 필요해요 (TARGET_LAG 사용 시). |
지정된 권한 집합으로 사용자 지정 역할을 만드는 방법은 사용자 지정 역할 만들기(Creating custom roles)를 참고해요. 보호 가능한 객체에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여의 일반적인 내용은 접근 제어 개요(Overview of Access Control)를 참고해요.
사용 메모 (Usage notes)
OR REPLACE와 IF NOT EXISTS 절은 서로 배타적이에요. 같은 문에서 둘 다 사용할 수 없어요.
CREATE OR REPLACE <object> 문은 원자적(atomic)으로 동작해요. 즉, 객체를 교체할 때 기존 객체는 삭제되고 새 객체는 단일 트랜잭션 안에서 생성돼요.
인터랙티브 테이블은 인터랙티브 웨어하우스가 아닌 표준 웨어하우스로 만들어야 해요.
CLUSTER BY 절은 모든 인터랙티브 테이블에 필수이며 쿼리 성능에 크게 영향을 미쳐요. 가장 흔한 WHERE 절 패턴에 기반해 클러스터링 컬럼을 신중히 선택해요.
인터랙티브 테이블은 인터랙티브 웨어하우스를 통해 쿼리할 때 최상의 성능을 제공해요. 인터랙티브 테이블의 최적 성능을 얻으려면:
- 인터랙티브 웨어하우스를 만들어요.
- ALTER WAREHOUSE … ADD TABLES로 인터랙티브 테이블을 인터랙티브 웨어하우스에 연결해요.
- 인터랙티브 웨어하우스를 재개해요.
- 인터랙티브 웨어하우스로 인터랙티브 테이블을 쿼리해요.
인터랙티브 테이블은 표준 테이블에 비해 제한된 SQL 작업 집합을 지원해요.
- WHERE 절이 있는 SELECT 문이 최적화돼요.
- 단순 GROUP BY 작업이 지원돼요.
- DML 작업(INSERT, UPDATE, DELETE)이 지원되지 않아요. 허용되는 유일한 DML 작업은 INSERT OVERWRITE예요.
- 복잡한 쿼리 작업은 제한적인 성능 이점이 있을 수 있어요.
동적 인터랙티브 테이블(TARGET_LAG 포함)은 지정된 표준 웨어하우스를 사용해 자동으로 새로 고쳐져요. 지연 시간은 데이터 신선도와 컴퓨트 비용을 균형 잡아요.
정적 인터랙티브 테이블은 자동으로 새로 고쳐지지 않아요. 소스 데이터의 변경을 반영하려면 수동 업데이트가 필요해요. 그러려면 인터랙티브 테이블에 CREATE OR REPLACE 명령이나 INSERT OVERWRITE 명령을 실행해요.
조건부 컬럼을 사용하는 단일 마스킹 정책은 테이블의 컬럼 구조가 정책에 지정된 컬럼과 일치한다면 여러 테이블에 적용할 수 있어요.
하나 이상의 테이블 컬럼에 마스킹 정책이 있거나 테이블에 행 접근 정책이 추가된 테이블을 만들 때, POLICY_CONTEXT 함수를 사용해 마스킹 정책으로 보호되는 컬럼과 행 접근 정책으로 보호되는 테이블에 대한 쿼리를 시뮬레이션해요.
인터랙티브 테이블은 쿼리를 가속화하기 위해 추가 메타데이터와 인덱스 정보를 저장하지만, 이것은 압축되어 스토리지 크기에 미치는 영향이 최소예요.
메타데이터에 관해서는 다음 사항에 주의해요.
⚠️ 주의: 고객은 Snowflake 서비스를 사용할 때 (User 객체를 제외하고) 개인 데이터·민감 데이터·수출 통제 데이터·기타 규제 데이터를 메타데이터로 입력하지 않도록 해야 해요. 자세한 내용은 Snowflake의 메타데이터 필드를 참고해요.
WITH STORAGE LIFECYCLE POLICY 절로 테이블을 만들 때:
- 정책을 적용하는 데 필요한 권한이 있어야 해요. 필요한 권한에 대한 정보는 스토리지 수명주기 정책 권한(Storage lifecycle policy privileges)을 참고해요.
- 테이블은 연결된 스토리지 수명주기 정책을 하나만 가질 수 있어요.
- 컬럼 수는 정책 함수 시그니처의 인자 수와 일치해야 하고, 컬럼 데이터는 인자 유형과 호환되어야 해요.
- 테이블 컬럼 이름을 바꿔도 연결된 정책은 영향받지 않아요. Snowflake는 컬럼 ID로 정책을 테이블에 연결해요.
- 스토리지 수명주기 정책 표현식을 평가하고 적용하기 위해 Snowflake는 내부적으로·일시적으로 테이블의 모든 거버넌스 정책을 우회해요.
변형 구문: 정적 인터랙티브 테이블 (Static interactive table)
소스 쿼리에서 한 번 채워지는 정적 인터랙티브 테이블을 만들어요.
CREATE [ OR REPLACE ] INTERACTIVE TABLE <table_name>
CLUSTER BY ( <expr> [ , <expr> , ... ] )
[ COMMENT = '<string_literal>' ]
AS <query>
정적 인터랙티브 테이블은 자동으로 새로 고쳐지지 않아요. 소스 데이터의 변경을 반영하려면 수동 업데이트가 필요해요. 그러려면 인터랙티브 테이블에 CREATE OR REPLACE 명령이나 INSERT OVERWRITE 명령을 실행해요.
변형 구문: 동적 인터랙티브 테이블 (Dynamic interactive table)
지정된 지연 시간에 기반해 자동으로 새로 고쳐지는 동적 인터랙티브 테이블을 만들어요.
CREATE [ OR REPLACE ] INTERACTIVE TABLE <table_name>
CLUSTER BY ( <expr> [ , <expr> , ... ] )
TARGET_LAG = '<num> { seconds | minutes | hours | days }'
WAREHOUSE = <warehouse_name>
[ COMMENT = '<string_literal>' ]
AS <query>
동적 인터랙티브 테이블은 지정된 표준 웨어하우스로 새로 고침 작업을 사용해 소스 데이터의 지정된 TARGET_LAG 안에 머물도록 자동으로 새로 고쳐져요.
예시 (Examples)
다음 예시들은 인터랙티브 테이블을 만들 수 있는 다양한 방법과 함께, 데이터 소스와 새로 고침 방법을 보여줘요.
기본 정적 인터랙티브 테이블
기존 주문 데이터에서 정적 인터랙티브 테이블을 만들고, 최적의 쿼리 성능을 위해 고객과 날짜로 클러스터링해요.
CREATE INTERACTIVE TABLE orders_interactive
CLUSTER BY (customer_id, order_date)
COMMENT = 'Interactive table for real-time order analytics'
AS
SELECT customer_id, order_date, product_id, quantity, total_amount
FROM orders_staging
WHERE order_date >= '2024-01-01';
자동 새로 고침이 있는 동적 인터랙티브 테이블
5분마다 새로 고쳐져 거의 실시간 판매 요약을 제공하는 동적 인터랙티브 테이블을 만들어요.
CREATE INTERACTIVE TABLE sales_summary_interactive
CLUSTER BY (region, product_category)
TARGET_LAG = '5 minutes'
WAREHOUSE = refresh_warehouse
COMMENT = 'Real-time sales dashboard data'
AS
SELECT
region,
product_category,
SUM(sales_amount) as total_sales,
COUNT(*) as transaction_count,
AVG(sales_amount) as avg_sale
FROM sales_data
GROUP BY region, product_category;
복잡한 쿼리를 위한 다중 컬럼 클러스터링
다양한 쿼리 패턴에 최적화된 다중 컬럼 클러스터링이 있는 인터랙티브 테이블을 만들어요.
CREATE INTERACTIVE TABLE customer_analytics_interactive
CLUSTER BY (customer_tier, region, signup_date)
TARGET_LAG = '10 minutes'
WAREHOUSE = analytics_warehouse
AS
SELECT
customer_id,
customer_tier,
region,
signup_date,
total_orders,
lifetime_value,
last_order_date
FROM customer_metrics
WHERE customer_tier IN ('GOLD', 'PLATINUM', 'DIAMOND');
기존 인터랙티브 테이블 교체
업데이트된 클러스터링과 새로 고침 설정으로 기존 인터랙티브 테이블을 교체해요.
CREATE OR REPLACE INTERACTIVE TABLE product_performance_interactive
CLUSTER BY (category, brand, launch_date)
TARGET_LAG = '2 minutes'
WAREHOUSE = fast_refresh_warehouse
AS
SELECT
product_id,
category,
brand,
launch_date,
units_sold,
revenue,
customer_rating
FROM product_sales_view
WHERE launch_date >= DATEADD('month', -6, CURRENT_DATE());
더 알아보기 (Learn more)
- CREATE INTERACTIVE WAREHOUSE — 인터랙티브 웨어하우스 생성
- SHOW INTERACTIVE TABLES — 인터랙티브 테이블 조회
- ALTER WAREHOUSE — 웨어하우스 수정