CREATE INDEX¶
Cria um novo índice secundário em uma tabela híbrida existente e preenche o índice com dados.
A criação de um índice é uma operação online (sem bloqueio). A tabela híbrida permanecerá disponível para instruções SELECT e DML enquanto o índice estiver sendo criado.
- Consulte também:
DROP INDEX , SHOW INDEXES , CREATE HYBRID TABLE , DROP TABLE , DESCRIBE TABLE , SHOW HYBRID TABLES
Sintaxe¶
CREATE [ OR REPLACE ] INDEX [ IF NOT EXISTS ] <index_name>
( <col_name>
[ , <col_name> ] ) ON <table_name>
Parâmetros¶
index_name
Especifica o identificador do novo índice. O nome deve ser exclusivo para a tabela híbrida para a qual o índice é criado. Nenhum outro índice secundário com o mesmo nome ou no mesmo conjunto ordenado de colunas pode existir na tabela híbrida.
table_name
Especifica o nome de uma tabela híbrida existente que conterá o novo índice.
col_name
Especifica o nome de uma coluna existente da tabela híbrida. Todos os requisitos para colunas de índice definidos na criação da tabela se aplicam aos identificadores de colunas.
Notas de uso¶
O comando CREATE INDEX não pode ser usado para adicionar uma restrição de chave externa, primária ou exclusiva.
Para criar um índice, você deve usar uma função que tenha o privilégio OWNERSHIP na tabela híbrida.
Você deve escolher um nome exclusivo para cada novo índice de uma determinada tabela híbrida.
Ao escolher as colunas para o novo índice, observe que uma tabela híbrida não pode conter dois índices secundários definidos no mesmo conjunto ordenado de colunas.
Alguns tipos de colunas (por exemplo, VARIANT) não são permitidos em um índice secundário.
A criação de um novo índice não bloqueia simultaneamente outras cargas de trabalho. A tabela híbrida está disponível para instruções SELECT e DML simultâneas.
Somente uma operação de criação de índice ativo por tabela híbrida é permitida a qualquer momento.
Você pode acompanhar o progresso da criação de um índice usando SHOW INDEXES. A coluna STATUS pode assumir os seguintes valores:
ACTIVE: o índice está completo e pode ser usado para recuperar dados.
SUSPENDED: o índice é atualizado apenas e não é usado para recuperar dados.
BUILD FAILURE: ocorreu um erro no processo de criação do índice. Você precisa descartar e recriar o índice.
BUILD IN PROGRESS: o índice está sendo criado e não é usado para recuperar dados.
Você pode reconstruir um índice não ativo, cujo status seja SUSPENDED, BUILD FAILURE ou BUILD IN PROGRESS, usando DROP INDEX e CREATE INDEX.
Se quiser descartar uma coluna que faz parte de um índice que está sendo construído, primeiro você precisará interromper a construção do índice descartando o índice e, em seguida, descartando a coluna. Se você tentar descartar a coluna antes de descartar o índice, receberá esta mensagem de erro:
Column '<nome_da_coluna>' cannot be dropped because it is used by index '<nome-do-índice>'.
A criação do índice online não progredirá até que todas as transações ativas com DMLs na mesma tabela no momento em que a instrução CREATE INDEX foi emitida sejam concluídas. Se alguma dessas transações permanecer inativa por mais de 5 minutos, ela será cancelada por padrão. Consulte Transações.
Durante o processo de construção do índice, qualquer DML realiza gravações no novo índice, mas não usa o índice para recuperar dados.
Um pequeno número de DMLs simultâneos, que iniciaram a execução após a conclusão do comando CREATE INDEX, pode falhar e retornar este erro:
DML não tinha conhecimento de DDL simultâneos. Tente fazer esta consulta novamente.
Se as instruções DML abortadas pertencerem a uma transação com múltiplas instruções, a transação será revertida somente se o parâmetro TRANSACTION_ABORT_ON_ERROR estiver definido como
TRUE
.Um índice recém-criado será usado para recuperar dados somente quando o processo de criação do índice for concluído com êxito e o status do índice for ACTIVE.
Exemplos¶
Os exemplos a seguir presumem que você já criou uma tabela híbrida e que ela contém alguns registros.
CREATE OR REPLACE HYBRID TABLE mytable (
pk INT PRIMARY KEY,
val INT
val2 INT
);
INSERT INTO mytable SELECT seq, seq+100, seq+200
FROM (SELECT seq8() seq FROM TABLE(GENERATOR(rowcount => 100)) v);
Você pode criar um índice na tabela usando o seguinte:
CREATE OR REPLACE INDEX vidx (val) ON mytable;
O comando retorna esta mensagem: BUILD IN PROGRESS O índice está sendo construído e registrará alterações de DML simultâneas na tabela base. O índice não será usado até que a construção seja concluída.
Se ocorrer uma falha enquanto a criação do índice estiver em andamento, o comando SHOW INDEXES indicará que a operação falhou: BUILD FAILURE Falha na criação do índice. Descarte o índice e recrie-o.
Se você decidir interromper a criação do índice, poderá usar um comando DROP INDEX:
DROP INDEX vid ON mytable;
+-------------------------------------+
| status |
|-------------------------------------|
| Statement executed successfully. |
+-------------------------------------+