CREATE HYBRID TABLE

현재/지정된 스키마에 새 하이브리드 테이블을 만들거나 기존 테이블을 대체합니다. 이름, 데이터 타입 그리고 선택적으로 열이 다음과 같은지 여부로 구성된 각각의 열 정의를 사용하여 테이블에 여러 개의 열이 있을 수 있습니다.

  • NOT NULL 값이 필요한지 여부.

  • 기본값이 있는지, 또는 ID 열인지 여부.

  • 인라인 제약 조건이 있는지 여부.

또한, 이 명령은 다음 베리언트를 지원합니다.

  • CREATE HYBRID TABLE … AS SELECT(채워진 테이블을 생성하며 CTAS라고도 함)

  • CREATE HYBRID TABLE … LIKE(기존 하이브리드 테이블의 빈 복사본을 생성함)

참고

하이브리드 테이블을 생성하려면 기본 키 제약 조건이 필요합니다.

표준 Snowflake 테이블에 사용되는 전체 CREATE TABLE 구문은 CREATE TABLE 섹션을 참조하십시오.

참고 항목:

DROP INDEX, SHOW INDEXES

구문

CREATE [ OR REPLACE ] HYBRID TABLE [ IF NOT EXISTS ] <table_name>
  ( <col_name> <col_type>
    [
      {
        DEFAULT <expr>
          /* AUTOINCREMENT (or IDENTITY) is supported only for numeric data types (NUMBER, INT, FLOAT, etc.) */
        | { AUTOINCREMENT | IDENTITY }
          [
            {
              ( <start_num> , <step_num> )
              | START <num> INCREMENT <num>
            }
          ]
          [ { ORDER | NOORDER } ]
      }
    ]
    [ NOT NULL ]
    [ inlineConstraint ]
    [ , <col_name> <col_type> [ ... ] ]
    [ , outoflineIndex ]
    [ , ... ]
  )
  [ COMMENT = '<string_literal>' ]
Copy

여기서

inlineConstraint ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY | { [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> ) ] } }
  [ <constraint_properties> ]
Copy

중요

  • 하이브리드 테이블에는 기본 키 제약 조건이 있어야 합니다.

  • 하이브리드 테이블에는 외래 키 제약 조건이 적용됩니다.

  • 고유 및 외래 키 제약 조건에 따라 각각 자체 기본 인덱스가 구축됩니다. 인덱스로 인해 추가 데이터가 저장됩니다. 고유한 제약 조건을 정의하거나, 외래 키 제약 조건을 정의하거나, 인덱스를 정의하여 테이블 생성 시 인덱스를 정의할 수 있습니다. 아래의 아웃오브 라인 인덱스 정의는 포괄적인 인덱스 생성을 허용하도록 확장되었습니다.

  • 인덱스는 반정형이 아닌 열(즉, 베리언트, 오브젝트, 배열)에만 정의할 수 있습니다. 포함된 열에도 동일한 제한 사항이 있습니다. 이는 각 레코드의 키에 대한 기본 저장소 엔진과 관련된 공간 제약 조건 때문입니다. 포함된 열은 테이블 생성 시에만 지정할 수 있습니다.

outoflineIndex ::=
  INDEX <index_name> ( <col_name> [ , <col_name> , ... ] )
Copy

추가 인라인 제약 조건의 세부 정보는 CREATE | ALTER TABLE … CONSTRAINT 를 참조하십시오.

하이브리드 테이블 제약 조건에 관한 제한 사항에 대한 자세한 내용은 하이브리드 테이블에 대해 지원되지 않는 기능과 제한 사항 섹션을 참조하십시오.

베리언트 구문

CREATE HYBRID TABLE … AS SELECT (CTAS라고도 함)

다른 하이브리드 테이블에 대한 쿼리 결과를 포함하는 새 하이브리드 테이블을 생성합니다.

CREATE [ OR REPLACE ] HYBRID TABLE <table_name> [ ( <col_name> [ <col_type> ] , <col_name> [ <col_type> ] , ... ) ]
  AS SELECT <query>
  [ ... ]
Copy

참고

CTAS를 사용하여 하이브리드 테이블을 생성하는 경우 기본 키, 인덱스, 제약 조건을 포함하여 테이블 스키마를 명시적으로 정의하십시오. SELECT 문에서 스키마 추론에 의존하지 마십시오.

CREATE HYBRID TABLE … LIKE

기존 하이브리드 테이블과 같은 열 정의를 사용하지만, 기존 테이블에서 데이터를 복사하지 않고 새 하이브리드 테이블을 만듭니다.

열 이름, 유형, 기본값, 제약 조건이 새 테이블에 복사됩니다.

CREATE [ OR REPLACE ] HYBRID TABLE <table_name> LIKE <source_table>
  [ ... ]
Copy

참고

현재, CREATE HYBRID TABLE … LIKE는 원본 테이블 유형으로 다른 하이브리드 테이블만 지원합니다.

데이터 공유를 통해 액세스되는 자동 증분 시퀀스가 있는 테이블에 대한 CREATE HYBRID TABLE … LIKE는 현재 지원되지 않습니다.

필수 매개 변수

name

테이블의 식별자(즉, 이름)를 지정하며, 테이블이 생성되는 스키마에 대해 고유해야 합니다.

또한, 식별자는 알파벳 문자로 시작해야 하며 전체 식별자 문자열을 큰따옴표(예: "My object")로 묶지 않는 한 공백이나 특수 문자를 포함할 수 없습니다. 큰따옴표로 묶인 식별자도 대/소문자를 구분합니다.

자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.

col_name

열 식별자(예: 이름)를 지정합니다. 테이블 식별자에 대한 모든 요구 사항은 열 식별자에도 적용됩니다.

자세한 내용은 식별자 요구 사항예약된 키워드와 제한된 키워드 섹션을 참조하십시오.

참고

표준 예약 키워드 외에, 다음 키워드는 ANSI 표준 컨텍스트 함수용으로 예약되어 있으므로 열 식별자로 사용할 수 없습니다.

  • CURRENT_DATE

  • CURRENT_ROLE

  • CURRENT_TIME

  • CURRENT_TIMESTAMP

  • CURRENT_USER

예약된 키워드의 목록은 예약된 키워드와 제한된 키워드 를 참조하십시오.

col_type

열의 데이터 타입을 지정합니다.

테이블 열에 지정할 수 있는 데이터 타입에 대한 자세한 내용은 SQL 데이터 타입 참조 을 참조하십시오.

query

AS SELECT를 사용하는 경우 필요함(즉, CTAS)

테이블을 채우는 데 사용되는 SELECT 문을 지정하는 문자열입니다.

선택적 매개 변수

DEFAULT ... 또는 . AUTOINCREMENT ...

INSERT 또는 CREATE HYBRID TABLE AS SELECT 문을 통해 값이 명시적으로 지정되지 않은 경우 기본값이 열에 자동으로 삽입되는지 여부를 지정합니다.

DEFAULT expr

열 기본값은 다음 중 하나일 수 있는 지정된 식으로 정의됩니다.

  • 상수 값.

  • 간단한 식.

  • 시퀀스 참조(seq_name.NEXTVAL).

간단한 식은 스칼라 값을 반환하는 식이지만, 이 식은 다음에 대한 참조를 포함할 수 없습니다.

  • 하위 쿼리.

  • 집계.

  • 윈도우 함수.

  • 외부 함수.

{ AUTOINCREMENT | IDENTITY } . [ { ( start_num , step_num ) | START num INCREMENT num } ] . [ { ORDER | NOORDER } ]

AUTOINCREMENT 가 사용될 때 열의 기본값은 지정된 숫자로 시작하고 각각의 연속 값은 자동으로 생성됩니다. AUTOINCREMENT 열에서 생성된 값은 고유성이 보장됩니다. 생성된 값 페어 간의 차이는 증분량의 배수가 되도록 보장됩니다.

선택적 ORDERNOORDER 매개 변수는 생성된 값이 시퀀스 의미 체계 에 지정된 순서 보장을 제공하는지 여부를 지정합니다. NOORDER 는 하이브리드 테이블의 AUTOINCREMENT 열에 대한 기본 옵션입니다. NOORDER 는 일반적으로 포인트 쓰기에 훨씬 더 나은 성능을 제공합니다.

이러한 매개 변수는 숫자 데이터 타입이 있는 열에만 사용할 수 있습니다.

AUTOINCREMENTIDENTITY 는 동의어입니다. 열에 대해 둘 중 하나가 지정될 경우 Snowflake는 열에 대한 값을 생성하는 시퀀스를 활용합니다. 시퀀스에 대한 자세한 내용은 시퀀스 사용하기 을 참조하십시오.

시작 및 단계/증분 모두에 대한 기본값은 1 입니다.

기본값: 값 없음(열에 기본값이 없음)

참고

  • DEFAULTAUTOINCREMENT 는 상호 배타적이며 한 열에 하나만 지정할 수 있습니다.

  • 성능에 민감한 워크로드의 경우 NOORDERAUTOINCREMENT 열에 권장되는 옵션입니다.

CONSTRAINT ...

테이블에서 지정한 열에 대한 인라인 제약 조건을 정의합니다.

구문 세부 정보는 CREATE | ALTER TABLE … CONSTRAINT 를 참조하십시오. 제약 조건에 대한 자세한 내용은 제약 조건 을 참조하십시오.

COMMENT = 'string_literal'

테이블에 대한 설명을 지정합니다.

기본값: 값 없음

사용법 노트

  • 하이브리드 테이블에는 기본 키 제약 조건이 있어야 합니다.

  • 하이브리드 테이블을 다시 생성하거나 교체하려면 CREATE [ OR REPLACE ] 명령을 실행하기 전에 GET_DDL 함수를 호출하여 하이브리드 테이블의 정의를 확인하십시오.

  • 스키마는 이름이 같은 테이블 및/또는 뷰를 포함할 수 없습니다. 테이블을 만들 때는 다음 사항이 적용됩니다.

    • 스키마에 같은 이름의 뷰가 이미 있는 경우 오류가 반환되고 테이블이 생성되지 않습니다.

    • 같은 이름의 테이블이 스키마에 이미 있는 경우 명령에 선택적인 OR REPLACE 키워드를 포함하지 않는 한 오류가 반환되고 테이블이 생성되지 않습니다.

    중요

    OR REPLACE 를 사용하는 것은 기존 테이블에서 DROP TABLE 을 사용한 다음 같은 이름을 가진 새 테이블을 만드는 것과 같습니다.

    drop 및 create 작업은 단일 원자성 작업에서 발생함에 유의하십시오. 이는 CREATE OR REPLACE TABLE 작업과 동시에 수행되는 모든 쿼리가 이전 또는 새 테이블 버전을 사용함을 의미합니다.

    테이블을 다시 만들거나 바꾸면 변경 데이터가 삭제됩니다.

  • 예약된 키워드 와 마찬가지로, ANSI로 예약된 함수 이름(CURRENT_DATE, CURRENT_TIMESTAMP 등)을 열 이름으로 사용할 수 없습니다.

  • CREATE HYBRID TABLE … AS SELECT (CTAS):

    • SELECT 목록에 있는 열 이름의 별칭이 유효한 열이면 CTAS 문에 열 정의가 필요하지 않습니다. 열 이름과 유형이 생략된 경우 이들은 기본 쿼리에서 유추됩니다.

      CREATE HYBRID TABLE <table_name> AS SELECT ...
      
      Copy

      또는 다음 구문을 사용하여 이름을 명시적으로 지정할 수 있습니다.

      CREATE HYBRID TABLE <table_name> ( <col1_name> , <col2_name> , ... ) AS SELECT ...
      
      Copy

      지정된 열 이름의 개수는 쿼리의 SELECT 목록 항목 개수와 일치해야 하며, 열의 유형은 쿼리로 생성된 유형에서 유추됩니다.

    • 특정 순서의 행이 있는 테이블을 만들려면 CTAS의 SELECT 절에서 ORDER BY 하위 절을 사용하십시오.

    • CTAS 문에서 테이블의 스키마를 결정할 수 있지만 스키마를 명시적으로 지정하는 것이 좋습니다.

  • 메타데이터 관련:

    주의

    고객은 Snowflake 서비스를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.

  • 인덱스:

    • 고유 제약 조건, 외래 키 제약 조건 또는 인덱스를 정의하여 생성 시 하이브리드 테이블의 인덱스를 정의할 수 있습니다. CREATE HYBRID TABLE 명령을 사용하면 outoflineIndex 매개 변수를 정의할 수 있습니다. 하이브리드 테이블의 인덱스 생성에 대한 자세한 내용은 CREATE INDEX 섹션을 참조하십시오.

    • 각 레코드의 키에 대한 기본 저장소 엔진과 관련된 공간 제약 조건으로 인해 반정형이 아닌 열(Variant, Object, Array)에만 인덱스를 정의할 수 있습니다.

포함된 열 사용하기

보조 인덱스와 함께 포함된 열을 사용하는 것은 열 세트가 프로젝션 목록에는 있지만 조건자 목록에는 없는 쿼리를 자주 수행하는 경우에 특히 유용할 수 있습니다. 예:

-- Create the employee table with a covering index
CREATE HYBRID TABLE employee (
    employee_id INT PRIMARY KEY,
    employee_name STRING,
    employee_department STRING,
    INDEX idx_department (employee_department) INCLUDE (employee_name)
);

-- Sample data insertion
INSERT INTO employee VALUES
  (1, 'John Doe', 'Marketing'),
  (2, 'Jane Smith', 'Sales'),
  (3, 'Bob Johnson', 'Finance'),
  (4, 'Alice Brown', 'Marketing');

-- Example Queries using covering index
SELECT employee_name FROM employee WHERE employee_department = 'Marketing';
SELECT employee_name FROM employee WHERE employee_department in ('Marketing', 'Sales');
Copy

이 예에서 쿼리 SELECT employee_name FROM employee WHERE employee_department = 'Marketing';SELECT employee_name FROM employee WHERE employee_department in ['Marketing','Sales']; 는 둘 다 기본 테이블에 대한 조회를 방지하여 포괄적인 인덱스의 이점을 얻습니다. 그러나 인덱스에 포함된 열을 사용하면 추가 열이 보조 인덱스에 저장되므로 저장소 소비가 증가할 수 있습니다.

email 에 대한 고유한 제약 조건과 full_name 에 대한 보조 인덱스를 사용하여 현재 데이터베이스에 하이브리드 테이블을 만듭니다.

CREATE HYBRID TABLE mytable (
  customer_id INT AUTOINCREMENT PRIMARY KEY,
  full_name VARCHAR(255),
  email VARCHAR(255) UNIQUE,
  extended_customer_info VARIANT,
  INDEX index_full_name (full_name)
);
Copy
+-------------------------------------+
| status                              |
|-------------------------------------|
| Table MYTABLE successfully created. |
+-------------------------------------+

이전 예에서 생성된 테이블에 행을 삽입합니다.

INSERT INTO mytable (customer_id, full_name, email, extended_customer_info)
  SELECT 100, 'Jane Doe', 'jdoe@gmail.com',
    parse_json('{"address": "1234 Main St", "city": "San Francisco", "state": "CA", "zip":"94110"}');
Copy
+-------------------------+
| number of rows inserted |
|-------------------------|
|                       1 |
+-------------------------+

기본 키는 고유해야 합니다. 예를 들어, 이전 예의 동일한 기본 키를 두 번째로 삽입하려고 하면 다음 오류와 함께 실패합니다.

200001 (22000): Primary key already exists

이메일 주소는 인라인 UNIQUE 제약 조건도 따라야 합니다. 예를 들어, 동일한 이메일 주소를 가진 두 개의 레코드를 삽입하려고 하면 다음 오류와 함께 문이 실패합니다.

Duplicate key value violates unique constraint "SYS_INDEX_MYTABLE_UNIQUE_EMAIL"

테이블 속성 및 메타데이터를 확인합니다. is_hybrid 열의 값을 참조하십시오.

SHOW TABLES LIKE 'mytable';
Copy
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+
| created_on                    | name    | database_name | schema_name | kind  | is_hybrid | comment | cluster_by | rows | bytes | owner  | retention_time | automatic_clustering | change_tracking | search_optimization | search_optimization_progress | search_optimization_bytes | is_external |
|-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------|
| 2022-02-23 23:53:19.707 +0000 | MYTABLE | MYDB          | PUBLIC      | TABLE | Y         |         |            | NULL |  NULL | MYROLE | 10             | OFF                  | OFF             | OFF                 |                         NULL |                      NULL | N           |
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+

모든 하이브리드 테이블의 세부 정보를 확인합니다.

SHOW HYBRID TABLES;
Copy
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+
| created_on                    | name                      | database_name | schema_name | owner        | datastore_id | rows | bytes | comment |
|-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------|
| 2022-02-24 02:07:31.877 +0000 | MYTABLE                   | DEMO_DB       | PUBLIC      | ACCOUNTADMIN |         2002 | NULL |  NULL |         |
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+

테이블의 열에 대한 정보를 표시합니다.

DESC TABLE mytable;
Copy
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name              | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| CUSTOMER_ID       | NUMBER(38,0) | COLUMN | N     | NULL    | Y           | N          | NULL  | NULL       | NULL    | NULL        |
| FULL_NAME         | VARCHAR(256) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| APPLICATION_STATE | VARIANT      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

테이블에서 데이터를 선택합니다.

SELECT customer_id, full_name, email, extended_customer_info FROM mytable
  WHERE extended_customer_info['state'] = 'CA';
Copy
+-------------+-----------+----------------+------------------------------+
| CUSTOMER_ID | FULL_NAME | EMAIL          | EXTENDED_CUSTOMER_INFO       |
|-------------+-----------+----------------+------------------------------|
|         100 | Jane Doe  | jdoe@gmail.com | {                            |
|             |           |                |   "address": "1234 Main St", |
|             |           |                |   "city": "San Francisco",   |
|             |           |                |   "state": "CA",             |
|             |           |                |   "zip": "94110"             |
|             |           |                | }                            |
+-------------+-----------+----------------+------------------------------+