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 métodos.
CREATE HYBRID TABLE. O exemplo a seguir cria uma tabela híbrida com uma restrição PRIMARY KEY obrigatória, insere algumas linhas, exclui uma linha e consulta a tabela:
CREATE OR REPLACE HYBRID TABLE application_log ( id NUMBER PRIMARY KEY AUTOINCREMENT, col1 VARCHAR(20), col2 VARCHAR(20) NOT NULL ); INSERT INTO application_log (col1, col2) VALUES ('A1', 'B1'); INSERT INTO application_log (col1, col2) VALUES ('A2', 'B2'); INSERT INTO application_log (col1, col2) VALUES ('A3', 'B3'); INSERT INTO application_log (col1, col2) VALUES ('A4', 'B4'); SELECT * FROM application_log; UPDATE application_log SET col2 = 'B3-updated' WHERE id = 3; DELETE FROM application_log WHERE id = 4; SELECT * FROM application_log;
CREATE HYBRID TABLE … AS SELECT (CTAS) ou CREATE HYBRID TABLE … LIKE. Por exemplo:
CREATE OR REPLACE HYBRID TABLE dept_employees ( employee_id INT PRIMARY KEY, department_id VARCHAR(200) ) AS SELECT employee_id, department_id FROM company_employees;
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 dos carregamentos em massa depende de a tabela ter sido criada recentemente, sem nunca ter tido nenhum registro carregado, ou ter sido criada usando uma consulta CTAS.
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 para acelerar o processo de carregamento. Depois que a tabela é carregada, aplica-se o desempenho normal do INSERT. Você ainda pode executar cargas em lote incrementais com as operações COPY e INSERT INTO … SELECT, mas elas normalmente serão menos eficientes. Velocidades de carregamento em massa de aproximadamente 1 milhão de registros por minuto são comuns, mas podem variar muito com base na estrutura da tabela (por exemplo, registros maiores são mais lentos para carregar). O carregamento em massa otimizado será estendido para oferecer suporte a carregamentos em lote incrementais em um lançamento futuro.
Você pode verificar as informações de Statistics nos perfis de consulta do Snowsight para saber se o caminho rápido de carregamento em massa foi usado. Number of rows inserted é chamado de 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:

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, adicione uma restrição exclusiva e um índice secundário à definição da tabela:
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;
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.
Nota
Verifique o status da compilação do índice com o comando SHOW INDEXES. Só há suporte para uma construção de índice por vez.
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 NUMBER(38,0) 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)
);
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 criar índices secundários adicionais em atributos que não sejam chave primária para acelerar as buscas com base nesses atributos. Os índices podem reduzir o número de registros que são verificados quando um predicado de consulta usa uma das seguintes condições:
=
,>
,>=
,<
,<=
(operadores de comparação)Condições [ NOT ] IN
Condições [ NOT ] BETWEEN
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. Atente para as 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¶
Os tamanhos de índice são limitados em largura. Ao criar índices em colunas de uma tabela híbrida, especialmente í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. Nesse caso, a tabela contém um índice chamado IDX_HT100_COLS
:
The value is too long for index "IDX_HT100_COLS".
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 índices em menos colunas.
Você também pode tentar usar as colunas INCLUDE em índices secundários ao criar a tabela. Para um exemplo simples, consulte Crie um índice secundário com uma coluna INCLUDE. (As colunas INCLUDE são compatíveis quando você cria tabelas híbridas, mas não quando cria índices com o comando CREATE INDEX)