# Instrução CREATE INDEX

A instrução CREATE INDEX cria um índice em uma tabela. Os índices podem incluir uma ou mais colunas da tabela.

#### Sintaxe

    CREATE [UNIQUE] INDEX nome-do-índice
    ON nome-da-tabela ( nome-de-coluna-simples [ ASC | DESC ]
        [ , nome-de-coluna-simples [ ASC | DESC ]] * )

No Derby, o número máximo de colunas para chave do índice é 16.

O nome do índice não pode ter mais que 128 caracteres.

O nome da coluna não pode aparecer mais de uma vez na mesma instrução CREATE INDEX. Entretanto, índices diferentes podem incluir a mesma coluna.

O Derby pode utilizar os índices para melhorar o desempenho das instruções de manipulação de dados (consulte o Ajuste do Derby). Além disso, os índices UNIQUE fornecem uma maneira de verificar a integridade dos dados.

Os nomes dos índices são únicos no esquema (Alguns sistemas de banco de dados permitem que tabelas diferentes no mesmo esquema possuam índices com o mesmo nome, mas o Derby não permite). É assumido que a tabela e o índice estão no mesmo esquema, se o nome do esquema for especificado para um dos nomes, mas não para o outro. Se o nome do esquema for especificado tanto para o índice quanto para a tabela, será lançada uma exceção se os nomes dos esquemas não forem o mesmo. Se não for especificado o nome do esquema nem para a tabela e nem para o índice, será utilizado o esquema corrente.

O Derby utiliza, por padrão, a ordem ascendente de cada coluna para criar o índice. Especificar ASC após o nome da coluna não modifica o comportamento padrão. A palavra chave DESC após o nome da coluna faz com que o Derby utilize a ordem descendente da coluna para criar o índice. Utilizar a ordem descendente para uma coluna pode ajudar a melhorar o desempenho dos comandos que requerem resultados em uma ordem de classificação mista ou na ordem descendente, e para os comandos que selecionam o valor mínimo ou máximo de uma coluna indexada.

Se for especificado um nome de índice qualificado, o nome do esquema não poderá começar por `SYS`.

#### Índices e restrições

As restrições de unicidade, de chave primária, e de chave estrangeira, geram índices que impõem, ou "apoiam", a restrição (por isso, algumas vezes são chamados de índices de apoio). Se uma coluna, ou conjunto de colunas, tiver uma restrição UNIQUE ou PRIMARY KEY aplicada, não será permitido criar índice com estas colunas. O Derby já terá criado um índice com nome gerado pelo sistema. Os nomes gerados pelo sistema para os índices que apoiam as restrições são facilmente encontrados consultando as tabelas do sistema, se for especificado o nome da restrição. Por exemplo, para descobrir o nome do índice que apoia a restrição PK_VÔOS:

    SELECT CONGLOMERATENAME FROM SYS.SYSCONGLOMERATES,
    SYS.SYSCONSTRAINTS WHERE
    SYS.SYSCONGLOMERATES.TABLEID = SYSCONSTRAINTS.TABLEID
    AND CONSTRAINTNAME = 'PK_VÔOS'

    CREATE INDEX ÍNDICE_ORIGEM ON VÔOS(AEROPORTO_ORIGEM);

    -- valores monetários são geralmente ordenados do maior para o menor,
    -- portanto o índice é criado na ordem descendente

    CREATE INDEX PAG_DESC ON SAMP.EMPREGADOS (SALÁRIO);

    -- utilizar um tamanho de página maior para o índice

    CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.pageSize','8192');
    CREATE INDEX IDX_VENDAS ON SAMP.VENDAS (VENDAS);
    CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.storage.pageSize',NULL);

#### Tamanho da página e comprimento da chave

Nota: Em um índice, o tamanho das colunas chave deve ser igual ou menor que a metade do tamanho da página. Se o comprimento das colunas chave, de uma linha existente na tabela, for maior que a metade do tamanho da página do índice, a criação do índice para a tabela com estas colunas chave falhará. Este erro somente ocorre ao criar o índice, quando uma linha existente na tabela não respeita este critério. Após o índice ser criado, as inserções falham se o tamanho da chave associada não respeitar este critério.

#### Sistema de dependência de instruções

As instruções preparadas envolvendo SELECT, INSERT, UPDATE, UPDATE WHERE CURRENT, DELETE e DELETE WHERE CURRENT na tabela referenciada pela instrução CREATE INDEX são invalidadas quando o índice é criado. Os cursores abertos nas tabelas não são afetados.

Tópico pai: Instruções CREATE
Referências relacionadas
Instrução CREATE FUNCTION
Instrução CREATE PROCEDURE
Instrução CREATE SCHEMA
Instrução CREATE SYNONYM
Instrução CREATE TABLE
Instrução CREATE TRIGGER
Instrução CREATE VIEW