CREATE HYBRID TABLE

Cria uma nova tabela híbrida no esquema atual/especificado ou substitui uma tabela existente. Uma tabela pode ter várias colunas, com cada definição de coluna consistindo de um nome, tipo de dados e, opcionalmente, se a coluna:

  • Exige um valor NOT NULL.

  • Tem um valor padrão ou é uma coluna de identidade.

  • Tem alguma restrição embutida.

Além disso, este comando oferece suporte às seguintes variantes:

  • CREATE HYBRID TABLE … AS SELECT (cria uma tabela preenchida; também chamada de CTAS)

  • CREATE HYBRID TABLE … LIKE (cria uma cópia vazia de uma tabela híbrida existente)

Nota

A criação de uma tabela híbrida exige uma restrição de chave primária.

Para obter a sintaxe CREATE TABLE completa usada para tabelas padrão do Snowflake, consulte CREATE TABLE.

Consulte também:

DROP INDEX, SHOW INDEXES

Sintaxe

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

Onde:

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

Importante

  • Uma tabela híbrida deve obrigatoriamente ter uma restrição de chave primária.

  • As restrições de chave estrangeira são impostas em tabelas híbridas.

  • Cada uma das restrições de chave única e estrangeira cria seu próprio índice subjacente. O índice resulta no armazenamento de dados adicionais. Os índices podem ser definidos no momento da criação da tabela, definindo restrições exclusivas, definindo restrições de chave estrangeira ou definindo índices. A definição de índice fora de linha abaixo foi estendida para permitir a criação de índices de cobertura.

  • Os índices podem ser definidos apenas em colunas que não são semiestruturadas (ou seja, variante, objeto, matriz). As colunas incluídas também têm as mesmas restrições. Isto se deve às restrições de espaço associadas aos mecanismos de armazenamento subjacentes para a chave de cada registro. As colunas incluídas só podem ser especificadas quando uma tabela é criada.

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

Para detalhes adicionais de restrição em linha, consulte CREATE | ALTER TABLE … CONSTRAINT.

Para obter informações sobre limitações relacionadas às restrições de tabelas híbridas, consulte Recursos e limitações não suportados para tabelas híbridas.

Sintaxe da variante

CREATE HYBRID TABLE … AS SELECT (também chamado de CTAS)

Cria uma nova tabela híbrida que contém os resultados de uma consulta em outra tabela híbrida:

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

Nota

Ao usar CTAS para criar uma tabela híbrida, defina explicitamente o esquema da tabela, incluindo a chave primária, os índices e as restrições. Não confie na inferência do esquema a partir de uma instrução SELECT.

CREATE HYBRID TABLE … LIKE

Cria uma nova tabela híbrida com as mesmas definições de coluna que uma tabela híbrida existente, mas sem copiar os dados da tabela existente.

Os nomes das colunas, tipos, padrões e restrições são copiados para a nova tabela:

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

Nota

Atualmente, CREATE HYBRID TABLE … LIKE oferece suporte apenas a outra tabela híbrida como tipo de tabela de origem.

CREATE HYBRID TABLE … LIKE para uma tabela com uma sequência de incremento automático acessada por meio de um compartilhamento de dados não é suportada no momento.

Parâmetros obrigatórios

name

Especifica o identificador (ou seja, nome) da tabela; deve ser único para o esquema no qual a tabela é criada.

Além disso, o identificador deve começar com um caractere alfabético e não pode conter espaços ou caracteres especiais, a menos que toda a cadeia de caracteres do identificador esteja entre aspas duplas (por exemplo, "My object"). Os identificadores delimitados por aspas duplas também diferenciam letras maiúsculas de minúsculas.

Para obter mais informações, consulte Requisitos para identificadores.

col_name

Especifica o identificador da coluna (ou seja, o nome). Todos os requisitos de identificadores de tabela também se aplicam aos identificadores de coluna.

Para obter mais detalhes, consulte Requisitos para identificadores e Palavras-chave reservadas e limitadas.

Nota

Além das palavras-chave padrão reservadas, as seguintes palavras-chave não podem ser usadas como identificadores de coluna porque são reservadas para funções de contexto padrão ANSI:

  • CURRENT_DATE

  • CURRENT_ROLE

  • CURRENT_TIME

  • CURRENT_TIMESTAMP

  • CURRENT_USER

Para a lista de palavras-chave reservadas, consulte Palavras-chave reservadas e limitadas.

col_type

Especifica o tipo de dados para a coluna.

Para obter mais detalhes sobre os tipos de dados que podem ser especificados para colunas de tabela, consulte Referência de tipos de dados SQL.

query

Exigido se estiver usando AS SELECT (ou seja, CTAS)

Cadeia de caracteres que especifica a instrução SELECT usada para preencher a tabela.

Parâmetros opcionais

DEFAULT ... ou . AUTOINCREMENT ...

Especifica se um valor padrão é automaticamente inserido na coluna caso um valor não seja explicitamente especificado por uma instrução INSERT ou CREATE HYBRID TABLE AS SELECT:

DEFAULT expr

O valor padrão da coluna é definido pela expressão especificada que pode ser qualquer uma das opções seguintes:

  • Valor constante.

  • Expressão simples.

  • Referência de sequência (seq_name.NEXTVAL).

Uma expressão simples é uma expressão que retorna um valor escalar; no entanto, a expressão não pode conter referências a:

  • Subconsultas.

  • Agregados.

  • Funções de janela.

  • Funções externas.

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

Quando AUTOINCREMENT é usado, o valor padrão da coluna começa com um número especificado e cada valor sucessivo é gerado automaticamente. Os valores gerados por uma coluna AUTOINCREMENT têm garantia de serem exclusivos. É garantido que a diferença entre qualquer par de valores gerados seja um múltiplo do valor do incremento.

Os parâmetros opcionais ORDER e NOORDER especificam se os valores gerados fornecem ou não garantias de ordenação conforme especificado em Semântica da sequência. NOORDER é a opção padrão para colunas AUTOINCREMENT em tabelas híbridas. NOORDER normalmente fornece desempenho significativamente melhor para gravações pontuais.

Esses parâmetros só podem ser usados para colunas com tipos de dados numéricos.

AUTOINCREMENT e IDENTITY são sinônimos. Se um deles for especificado para uma coluna, o Snowflake utilizará uma sequência para gerar os valores para a coluna. Para obter mais informações sobre sequências, consulte Uso de sequências.

O valor padrão para o início e o passo/incremento é 1.

Padrão: sem valor (a coluna não tem valor padrão)

Nota

  • DEFAULT e AUTOINCREMENT são mutuamente exclusivos; apenas um deles pode ser especificado para uma coluna.

  • Para cargas de trabalho sensíveis ao desempenho, NOORDER é a opção recomendada para colunas AUTOINCREMENT.

CONSTRAINT ...

Define uma restrição em linha para a(s) coluna(s) especificada(s) na tabela.

Para detalhes de sintaxe, consulte CREATE | ALTER TABLE … CONSTRAINT. Para obter mais informações sobre restrições, consulte Restrições.

COMMENT = 'string_literal'

Especifica um comentário para a tabela.

Padrão: sem valor

Notas de uso

  • Uma tabela híbrida deve obrigatoriamente ter uma restrição de chave primária.

  • Para recriar ou substituir uma tabela híbrida, chame a função GET_DDL para ver a definição da tabela híbrida antes de executar um comando CREATE [ OR REPLACE ].

  • Um esquema não pode conter tabelas e/ou visualizações com o mesmo nome. Ao criar uma tabela:

    • Se já existir uma visualização com o mesmo nome no esquema, um erro é emitido e a tabela não é criada.

    • Se uma tabela com o mesmo nome já existir no esquema, um erro é emitido e a tabela não é criada, a menos que a palavra-chave opcional OR REPLACE esteja incluída no comando.

    Importante

    Usar OR REPLACE é o equivalente a usar DROP TABLE na tabela existente e depois criar uma nova tabela com o mesmo nome.

    Observe que o descarte e a criação de ações ocorrem em uma única operação atômica. Isso significa que qualquer consulta concorrente com a operação CREATE OR REPLACE TABLE utiliza a versão da tabela antiga ou nova.

    A recriação ou troca de uma tabela descarta seus dados de alteração.

  • Assim como as palavras-chave reservadas, nomes de funções reservadas ANSI (CURRENT_DATE, CURRENT_TIMESTAMP etc.) não podem ser usados como nomes de colunas.

  • CREATE HYBRID TABLE … AS SELECT (CTAS):

    • Se os aliases para os nomes das colunas na lista SELECT forem colunas válidas, então as definições das colunas não são exigidas na instrução CTAS; se omitidos, os nomes e tipos das colunas são inferidos a partir da consulta subjacente:

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

      Alternativamente, os nomes podem ser explicitamente especificados usando a seguinte sintaxe:

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

      O número de nomes de colunas especificados deve corresponder ao número de itens da lista SELECT na consulta; os tipos das colunas são inferidos a partir dos tipos produzidos pela consulta.

    • Se você quiser que a tabela seja criada com linhas em uma ordem específica, então use uma subcláusula ORDER BY na cláusula SELECT do CTAS.

    • Embora seja possível determinar o esquema de uma tabela a partir da instrução CTAS, é recomendável especificar o esquema explicitamente.

  • Em relação aos metadados:

    Atenção

    Os clientes devem garantir que nenhum dado pessoal (exceto para um objeto do usuário), dados sensíveis, dados controlados por exportação ou outros dados regulamentados sejam inseridos como metadados ao usar o serviço Snowflake. Para obter mais informações, consulte Campos de metadados no Snowflake.

  • Índices:

    • Você pode definir um índice para uma tabela híbrida no momento da criação, definindo restrições exclusivas, restrições de chave estrangeira ou índices. Observe que o comando CREATE HYBRID TABLE permite definir um parâmetro outoflineIndex. Para obter mais informações sobre como criar um índice para uma tabela híbrida, consulte CREATE INDEX.

    • Devido às restrições de espaço associadas aos mecanismos de armazenamento subjacentes para a chave de cada registro, você só pode definir índices em colunas que não sejam semiestruturadas (Variante, Objeto, Matriz).

Uso de colunas incluídas

O uso de colunas incluídas com um índice secundário pode ser especialmente útil quando você tem consultas frequentes nas quais um conjunto de colunas está presente na lista de projeção, mas não na lista de predicados. Por exemplo:

-- 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

Neste exemplo, ambas as consultas SELECT employee_name FROM employee WHERE employee_department = 'Marketing'; e SELECT employee_name FROM employee WHERE employee_department in ['Marketing','Sales']; se beneficiarão do índice de cobertura, evitando pesquisas na tabela base. Mas observe que o uso de colunas incluídas em índices pode causar um aumento no consumo de armazenamento, pois colunas adicionais serão armazenadas no índice secundário.

Exemplos

Crie uma tabela híbrida no banco de dados atual com uma restrição exclusiva em email e um índice secundário em 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. |
+-------------------------------------+

Insira uma linha na tabela criada no exemplo anterior:

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 |
+-------------------------+

A chave primária deve ser exclusiva. Por exemplo, se você tentar inserir a mesma chave primária do exemplo anterior uma segunda vez, ocorrerá uma falha com o seguinte erro:

200001 (22000): Primary key already exists

O endereço de e-mail também deve seguir a restrição UNIQUE em linha. Por exemplo, se você tentar inserir dois registros com o mesmo endereço de e-mail, a instrução falhará com o seguinte erro:

Duplicate key value violates unique constraint "SYS_INDEX_MYTABLE_UNIQUE_EMAIL"

Visualize propriedades e metadados da tabela. Observe o valor da coluna 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           |
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+

Veja os detalhes de todas as tabelas híbridas:

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 |         |
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+

Exibe informações sobre as colunas da tabela:

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        |
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

Selecione os dados a partir da tabela:

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"             |
|             |           |                | }                            |
+-------------+-----------+----------------+------------------------------+