Criação de tabelas híbridas

Este tópico fornece uma visão geral sobre a criação de tabelas híbridas no Snowflake.

Nota

Para criar uma tabela híbrida, você deve ter um warehouse em execução especificado como o warehouse atual da sua sessão. Podem ocorrer erros se nenhum warehouse em execução for especificado ao criar uma tabela híbrida. Para obter mais informações, consulte Como trabalhar com warehouses.

Opções CREATE HYBRID TABLE

Você pode criar uma tabela híbrida usando um dos seguintes comandos SQL:

  • CREATE HYBRID TABLE. Este exemplo cria uma tabela híbrida, insere algumas linhas nela, exclui uma linha e consulta a tabela:

    CREATE OR REPLACE HYBRID TABLE icecream (
      id NUMBER PRIMARY KEY AUTOINCREMENT START 1 INCREMENT 1,
      col1 VARCHAR NOT NULL,
      col2 VARCHAR NOT NULL
      );
    
    INSERT INTO icecream VALUES(1, 'A1', 'B1');
    INSERT INTO icecream VALUES(2, 'A2', 'B2');
    INSERT INTO icecream VALUES(3, 'A3', 'B3');
    INSERT INTO icecream VALUES(4, 'A4', 'B4');
    
    UPDATE icecream SET col2 = 'B3-updated' WHERE id = 3;
    
    DELETE FROM icecream WHERE id = 4;
    
    SELECT * FROM icecream;
    
    Copy
  • CREATE HYBRID TABLE … AS SELECT (CTAS) ou CREATE HYBRID TABLE … LIKE. Por exemplo:

    CREATE OR REPLACE HYBRID TABLE table1 (
      employee_id INT PRIMARY KEY,
      department_id VARCHAR(200)
      )
    AS SELECT * FROM table2;
    
    Copy

Carregamento de dados

Nota

Como o armazenamento primário para tabelas híbridas é um armazenamento de linhas, as tabelas híbridas normalmente têm uma área de armazenamento maior do que as tabelas padrão. O principal motivo para a diferença é que dados em colunas para tabelas padrão geralmente atingem taxas mais altas de compressão. Para obter detalhes sobre custos de armazenamento, consulte Avaliar custo para tabelas híbridas.

Otimização de carregamentos em massa

É possível carregar dados em massa em tabelas híbridas copiando-os de um estágio de dados ou de outras tabelas (usando CTAS, COPY INTO <tabela> ou INSERT INTO … SELECT).

A otimização de carregamentos em massa depende do fato de a tabela estar vazia ou não. Neste contexto, uma tabela só é considerada vazia se nenhuma linha tiver sido carregada nela. Uma tabela existente cujas linhas foram excluídas não é considerada vazia. Uma tabela que acabou de ser criada e ainda não foi carregada de forma alguma, ou que está sendo criada e carregada no lugar com CTAS, está realmente vazia.

Quando uma tabela híbrida está vazia, todos os três métodos de carregamento (CTAS, COPY e INSERT INTO … SELECT) usam o carregamento em massa otimizado, que é um modelo de execução rápida para inserir dados em tabelas híbridas.

Atualmente, quando as tabelas híbridas não estão vazias, o carregamento em massa otimizado não é usado. Carregamentos em lote incrementais com as operações COPY e INSERT INTO … SELECT ainda podem ser realizados, mas normalmente serão menos eficientes. Você deve ver velocidades de carregamento de aproximadamente 1 milhão de registros por minuto, mas observe que essa estimativa depende da estrutura da tabela (por exemplo, registros maiores são mais lentos para carregar). Se suas cargas, atualizações e mesclagens demorarem muito e falharem, teste com um conjunto de dados menor ou divida essas operações em partes menores. O carregamento em massa otimizado será estendido para oferecer suporte a carregamentos em lote incrementais em um lançamento futuro.

É possível verificar as informações de Statistics no perfil de consulta no Snowsight para ver se o caminho rápido de carregamento em massa foi usado. Number of rows inserted é referido como Number of rows bulk loaded quando o caminho rápido é usado. Por exemplo, esta operação de CTAS carregou em massa 200.000 linhas em uma nova tabela:

Perfil de consulta de CTAS que usa o carregamento em massa otimizado

Um carregamento de lote incremental subsequente na mesma tabela não usaria o carregamento em massa otimizado.

Para obter mais informações sobre perfis de consulta, consulte Analisar perfis de consulta para tabelas híbridas e Monitoramento da atividade de consulta com o Histórico de consultas.

Atenção

Comandos CTAS não são compatíveis com as restrições FOREIGN KEY. Se sua tabela híbrida exigir restrições FOREIGN KEY, use COPY ou INSERT INTO … SELECT para carregar a tabela.

Nota

Outros métodos de carregamento de dados em tabelas Snowflake (por exemplo, Snowpipe) não são suportados atualmente.

Como adicionar índices a uma tabela híbrida

Você pode definir chaves, índices e restrições ao criar uma tabela híbrida. Por exemplo:

CREATE OR REPLACE HYBRID TABLE target_hybrid_table (
    col1 VARCHAR(32) PRIMARY KEY,
    col2 NUMBER(38,0) UNIQUE,
    col3 NUMBER(38,0),
    INDEX index_col3 (col3)
    )
  AS SELECT col1, col2, col3 FROM source_table);
Copy

Opcionalmente, você pode criar um índice para uma tabela híbrida existente usando CREATE INDEX. Use este comando para adicionar um índice a uma tabela híbrida que está sendo usada ativamente para uma carga de trabalho e está atendendo consultas ou tem chaves estrangeiras. CREATE INDEX irá construir um índice simultaneamente sem bloquear a tabela durante a operação.

No entanto, se seu aplicativo de tabela híbrida estiver em desenvolvimento ou em modo de teste, e algum tempo de inatividade para a tabela não for um problema, é mais eficiente recriar a tabela híbrida e criar os índices executando um carregamento em massa otimizado, o que é mais eficiente do que a criação de índices online com o comando CREATE INDEX.

O carregamento em massa otimizado é compatível com CTAS, COPY, e INSERT INTO … SELECT, mas você não pode usar CTAS se sua tabela tiver uma restrição FOREIGN KEY. A segunda tabela criada neste exemplo, fk_hybrid_table, teria de ser carregada em massa com COPY ou INSERT INTO … SELECT:

CREATE OR REPLACE HYBRID TABLE ref_hybrid_table (
    col1 VARCHAR(32) PRIMARY KEY,
    col2 INT UNIQUE);

CREATE OR REPLACE HYBRID TABLE fk_hybrid_table (
    col1 VARCHAR(32) PRIMARY KEY,
    col2 NUMBER(38,0),
    col3 NUMBER(38,0),
    FOREIGN KEY (col2) REFERENCES ref_hybrid_table(col2),
    INDEX index_col3 (col3)
);
Copy

Todas as tabelas híbridas exigem uma chave primária exclusiva. Os dados em uma tabela híbrida são ordenados por essa chave primária. Você pode adicionar índices secundários adicionais a atributos de chave não primários para acelerar pesquisas com esses atributos. Os índices podem ser aproveitados para os predicados =, >, >=, <, <=, IN para reduzir o número de registros a serem verificados.

Atenção

Para adicionar um índice secundário, você deve usar uma função que receba o privilégio SELECT na tabela híbrida. Se você tiver acesso a uma exibição dos dados na tabela híbrida, mas não à tabela em si, não será possível adicionar um índice secundário.

Se você tiver consultas comuns e repetidas com predicados em um atributo específico ou em um grupo composto de atributos, considere adicionar um índice a esse atributo ou grupo de atributos para melhorar o desempenho. Mas esteja ciente das seguintes considerações ao usar índices:

  • Aumento no consumo de armazenamento ao armazenar cópias adicionais do subconjunto de dados no índice.

  • Adição de sobrecarga a DMLs porque os índices são mantidos de forma síncrona.

Erros de construção de índice durante os carregamentos

Quando os índices estão sendo criados nas colunas de uma tabela híbrida, especialmente os índices em um grande número de colunas, qualquer comando que carregue a tabela (incluindo CTAS, COPY, ou INSERT INTO … SELECT) pode retornar o seguinte erro:

The value is too long for index "IDX_HT100_COLS".

Neste exemplo, IDX_HT100_COLS é o nome de um índice na tabela que está sendo criado.

Esse erro ocorre porque o armazenamento baseado em linhas impõe um limite no tamanho dos dados (e metadados) que podem ser armazenados por registro. Para reduzir o tamanho do registro, tente criar a tabela sem especificar colunas maiores (por exemplo, colunas largas VARCHAR) como colunas indexadas.

Você também pode tentar criar a tabela usando colunas INCLUDE em índices secundários em vez de indexar diretamente as colunas. Para um exemplo simples, consulte Crie um índice secundário com uma coluna INCLUDE.