CREATE INDEX

CREATE INDEX — define um novo índice

Sinopse

CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] nome_do_índice ]
    ON [ ONLY ] nome_da_tabela
    [ USING método ]
    ( { nome_da_coluna | ( expressão ) }
    [ COLLATE ordenação ] [ classe_de_operador
    [ ( parâmetro_de_classe_de_operador = valor
    [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
    [ INCLUDE ( nome_da_coluna [, ...] ) ]
    [ NULLS [ NOT ] DISTINCT ]
    [ WITH ( parâmetro_de_armazenamento [= valor] [, ... ] ) ]
    [ TABLESPACE nome_do_espaço_de_tabelas ]
    [ WHERE predicado ]

Descrição

O comando CREATE INDEX constrói um índice na(s) coluna(s) especificada(s) da relação especificada, que pode ser uma tabela ou uma visão materializada. Os índices são usados principalmente para melhorar o desempenho do banco de dados (embora o uso inadequado possa resultar em um desempenho mais lento).

Os campos-chave para o índice são especificados como nomes de coluna ou, como alternativa, expressões escritas entre parênteses. Podem ser especificados vários campos, se o método de índice oferecer suporte a índices com várias colunas.

Um campo de índice pode ser uma expressão calculada a partir dos valores de uma ou mais colunas da linha da tabela. Este recurso pode ser usado para obter acesso rápido aos dados com base em alguma transformação dos dados básicos. Por exemplo, um índice computado em upper(col) permite que a cláusula WHERE upper(col) = 'JIM' use um índice.

O PostgreSQL fornece os métodos de índice B-tree, hash, GiST, SP-GiST, GIN, e BRIN. Os usuários também podem definir seus próprios métodos de índice, mas isto é bastante complicado.

Quando a cláusula WHERE está presente, é criado um índice parcial. Um índice parcial é um índice contendo entradas apenas para uma parte da tabela, geralmente a parte que é mais útil para indexação do que o restante da tabela. Por exemplo, havendo uma tabela contendo pedidos faturados e não faturados, em que os pedidos não faturados ocupam uma pequena fração do total da tabela, e ainda assim esta é uma parte usada com frequência, pode-se melhorar o desempenho criando um índice apenas para esta parte. Outra aplicação possível é usar WHERE com UNIQUE, para impor a unicidade sobre um subconjunto da tabela. Veja Índices parciais para obter mais informações.

A expressão usada na cláusula WHERE pode se referir apenas às colunas da tabela subjacente, mas pode usar todas as colunas, não apenas as que estão sendo indexadas. No momento, também não são permitidas subconsultas e expressões de agregação na cláusula WHERE. As mesmas restrições se aplicam aos campos do índice que são expressões.

Todas as funções e operadores usados na definição do índice devem ser imutáveis, ou seja, seus resultados devem depender apenas de seus argumentos, e nunca de qualquer influência externa (como o conteúdo de outra tabela, ou a hora corrente). Esta restrição garante que o comportamento do índice seja bem definido. Para usar uma função definida pelo usuário em uma expressão de índice ou cláusula WHERE, esta função deve ter sido marcada como imutável ao ser criada.

Parâmetros

UNIQUE

Faz com que o sistema verifique se há valores duplicados na tabela quando o índice é criado (se os dados já existirem), e cada vez que são adicionados dados. As tentativas de inserir ou atualizar dados que resultariam em entradas duplicadas ocasionam erro.

Restrições adicionais se aplicam quando índices de unicidade são aplicados a tabelas particionadas; veja CREATE TABLE.

CONCURRENTLY

Quando esta opção é usada, o PostgreSQL constrói o índice sem obter nenhum bloqueio que impeça inserções, atualizações ou exclusões concorrentes na tabela; enquanto a construção de índice padrão bloqueia a escrita (mas não a leitura) na tabela até que seja concluída. Há várias advertências a serem observadas ao usar esta opção — veja Construção concorrente de índice abaixo.

Para tabelas temporárias, o comando CREATE INDEX é sempre não concorrente, porque nenhuma outra sessão pode acessá-las, e a criação de índice não concorrente é mais econômica.

IF NOT EXISTS

Não será relatado nenhum erro se já existir uma relação com o mesmo nome. É emitido um aviso neste caso. Note não haver garantia de que o índice existente tenha semelhança com aquele a ser criado. O nome do índice é requerido quando se especifica IF NOT EXISTS.

INCLUDE

A cláusula opcional INCLUDE especifica uma lista de colunas a serem incluídas no índice como colunas não-chave. Uma coluna não-chave não pode ser usada em uma qualificação de procura por varredura de índice, não sendo considerada para fins de qualquer unicidade ou restrição de exclusão imposta pelo índice. No entanto, uma varredura somente do índice pode retornar o conteúdo de colunas não-chave sem ter que visitar a tabela do índice, porque estas colunas estão disponíveis diretamente na entrada do índice. Assim, a adição de colunas não-chave permite que sejam usadas varreduras somente de índice para consultas que, de outra forma, não poderiam usá-las. [132]

É aconselhável ser conservador ao adicionar colunas não-chave a um índice, especialmente colunas grandes. Se uma tupla de índice exceder o tamanho máximo permitido para o tipo de índice, a inserção dos dados irá falhar. Em qualquer caso, as colunas não-chave duplicam os dados da tabela do índice, aumentando o tamanho do índice, e tornando as procuras potencialmente mais lentas. Além disso, nunca é usada a deduplicação de Árvore-B com índices que possuem uma coluna não-chave.

As colunas listadas na cláusula INCLUDE não precisam de classes de operador apropriadas; esta cláusula pode incluir colunas cujos tipos de dados não possuem classes de operador definidas para um determinado método de acesso.

As expressões não têm suporte como colunas incluídas, porque não podem ser usadas em varreduras somente de índice.

No momento, os métodos de acesso de índice B-tree, GiST e SP-GiST dão suporte a este recurso. Nesses índices, os valores das colunas listadas na cláusula INCLUDE são incluídos em tuplas folha que correspondem a tuplas da pilha (heap), mas não são incluídos nas entradas de nível superior do índice, usadas para navegação na árvore.

nome_do_índice

O nome do índice a ser criado. Não pode ser incluído nenhum nome de esquema aqui; o índice é sempre criado no mesmo esquema de sua tabela mãe. O nome do índice deve ser distinto do nome de qualquer outra relação (tabela, sequência, índice, visão, visão materializada ou tabela estrangeira) neste esquema. Se o nome for omitido, o PostgreSQL irá escolher um nome adequado com base no nome da tabela mãe, e no(s) nome(s) da(s) coluna(s) indexada(s).

ONLY

Indica não criar índices recursivamente não partições, se a tabela for particionada. O padrão é ser recursivo.

nome_da_tabela

O nome (possivelmente qualificado pelo esquema) da tabela a ser indexada.

método

O nome do método de índice a ser usado. As opções são btree, hash, gist, spgist, gin, brin, ou métodos de acesso instalados pelo usuário, como bloom. O método padrão é btree.

nome_da_coluna

O nome da coluna da tabela.

expressão

Uma expressão baseada em uma ou mais colunas da tabela. A expressão geralmente deve ser escrita entre parênteses, conforme mostrado na sintaxe. Entretanto, os parênteses podem ser omitidos se a expressão tiver a forma de uma chamada de função.

ordenação

O nome da ordenação a ser usado para o índice. Por padrão, o índice usa a ordenação declarada para a coluna a ser indexada, ou a ordenação resultante da expressão a ser indexada. Os índices com ordenação diferente do padrão podem ser úteis para consultas que envolvem expressões usando ordenações diferentes do padrão.

classe_de_operador

O nome da classe de operador. Veja os detalhes abaixo.

parâmetro_de_classe_de_operador

O nome do parâmetro da classe de operador. Veja os detalhes abaixo.

ASC

Especifica a ordem de classificação ascendente (que é o padrão).

DESC

Especifica a ordem de classificação descendente.

NULLS FIRST

Especifica que os nulos são classificados antes dos não nulos. Este é o padrão quando é especificado DESC.

NULLS LAST

Especifica que os nulos são classificados após os não nulos. Este é o padrão quando não é especificado DESC.

NULLS DISTINCT
NULLS NOT DISTINCT

Especifica se, para um índice de unicidade, os valores nulos devem ser considerados distintos (não iguais). Por padrão, eles são distintos, de modo que um índice de unicidade pode conter vários valores nulos em uma coluna.

parâmetro_de_armazenamento

O nome do parâmetro de armazenamento específico do método de índice. Veja Parâmetros de armazenamento do índice abaixo para obter detalhes.

nome_do_espaço_de_tabelas

O nome do espaço de tabelas onde o índice será criado. Se não for especificado será consultado default_tablespace, ou temp_tablespaces se a tabela for temporária.

predicado

A expressão de restrição para um índice parcial.

Parâmetros de armazenamento do índice

A cláusula opcional WITH especifica os parâmetros de armazenamento para o índice. Cada método de índice possui seu próprio conjunto de parâmetros de armazenamento permitidos.

Os métodos de índice B-tree, hash, GiST e SP-GiST aceitam este parâmetro:

fillfactor (integer) #

Controla o quanto o método de indexação tentará comprimir as páginas do índice. Para Árvores-B, as páginas folha são preenchidas com esta porcentagem durante as construções iniciais do índice, e também ao estender o índice à direita (adicionando novos valores de chave maiores). Se as páginas subsequentemente ficarem completamente cheias, elas serão divididas, levando à fragmentação da estrutura do índice no disco. As Árvores-B usam um fator de preenchimento padrão de 90, mas pode ser selecionado qualquer valor inteiro de 10 a 100.

Os índices Árvore-B em tabelas onde são antecipadas muitas inserções e/ou atualizações, podem se beneficiar de configurações de fator de preenchimento mais baixas no momento do comando CREATE INDEX (após o carregamento em massa na tabela). Valores na faixa de 50 a 90 podem suavizar de forma útil a taxa de divisões de página durante o início da vida do índice Árvore-B (reduzir o fator de preenchimento dessa forma pode até diminuir o número absoluto de divisões de página, embora este efeito seja altamente dependente da carga de trabalho). A técnica de exclusão de índice ascendente (bottom-up) da Árvore-B, descrita na Seção 65.1.4.2, depende de algum espaço extra nas páginas para armazenar as versões extras da tupla, portanto, podem ser afetada pelo fator de preenchimento (embora o efeito geralmente não seja significativo).

Em outros casos específicos, pode ser útil aumentar o fator de preenchimento para 100 no momento de execução do comando CREATE INDEX, para maximizar a utilização do espaço. Isto só deve ser considerado quando se tiver certeza absoluta de que a tabela é estática (ou seja, que nunca será afetada por inserções ou atualizações). Caso contrário, uma configuração de fator de preenchimento de 100 pode prejudicar o desempenho: até mesmo algumas poucas atualizações ou inserções irão causar uma enxurrada repentina de divisões de página.

Os outros métodos de índice usam o fator de preenchimento de maneiras diferentes, mas aproximadamente análogas; o fator de preenchimento padrão varia entre os métodos.

Os índices Árvore-B também aceitam este parâmetro:

deduplicate_items (boolean) #

Controla o uso da técnica de deduplicação da Árvore-B descrita na Seção 65.1.4.3. Deve ser definido como ON ou OFF, para ativar ou desativar a otimização. (São permitidas escritas alternativas para ON e OFF, conforme descrito na Definição de parâmetros.) O padrão é ON.

Nota

Desativar deduplicate_items por meio do comando ALTER INDEX evita que futuras inserções acionem a deduplicação, mas por si só não faz com que as tuplas da lista de postagens existentes usem a representação de tupla padrão.

Os índices GiST também aceitam este parâmetro:

buffering (enum) #

Controla se a técnica de construção com buffer descrita na Seção 65.2.4.1 é usada para construir o índice. Com OFF a técnica é desativada, com ON é ativada, e com AUTO é inicialmente desativada, mas é ativada instantaneamente quando o tamanho do índice atinge effective_cache_size. O padrão é AUTO. Note que se a construção classificada for possível, ela será usada em vez da construção com buffer, a menos que seja especificado buffering=ON.

Os índices GIN também aceitam estes parâmetros:

fastupdate (boolean) #

Controla o uso da técnica de atualização rápida descrita na Técnica de atualização rápida do GIN. ON ativa atualização rápida, OFF desativa. O padrão é ON.

Nota

Desativar fastupdate por meio do comando ALTER INDEX evita que inserções futuras entrem na lista de entradas de índice pendentes, mas por si só não libera as entradas anteriores. Pode-se usar o comando VACUUM na tabela, ou chamar a função gin_clean_pending_list posteriormente, para garantir que a lista de pendências seja esvaziada.

gin_pending_list_limit (integer) #

Substitui a configuração global de gin_pending_list_limit para este índice. Este valor é especificado em kilobytes.

Os índices BRIN também aceitam estes parâmetros:

pages_per_range (integer) #

Define o número de blocos da tabela que compõem um intervalo de blocos para cada entrada de índice BRIN (veja Seção 65.5.1 para obter mais detalhes). O valor padrão é de 128 blocos.

autosummarize (boolean) #

Define se a execução do resumo é enfileirada para o intervalo de páginas anterior, sempre que uma inserção é detectada no seguinte (veja Seção 65.5.1.1 para obter mais detalhes). O padrão é off.

Construção concorrente de índice

A criação de um índice pode interferir na operação regular do banco de dados. Normalmente, o PostgreSQL bloqueia a tabela a ser indexada contra escritas, e executa toda a construção do índice em uma única varredura da tabela. As demais transações ainda podem ler a tabela, mas se tentarem inserir, atualizar ou excluir linhas na tabela, elas serão bloqueadas até que a construção do índice esteja concluída. Isto pode provocar um impacto importante, se o sistema for um banco de dados de produção ativo. Tabelas muito grandes podem levar muitas horas para serem indexadas e, mesmo em tabelas menores, a construção do índice pode bloquear escrever por períodos inaceitavelmente longos para um sistema em produção.

O PostgreSQL oferece suporte a construção de índices sem bloquear a escrita. Este método é chamado especificando a opção CONCURRENTLY no comando CREATE INDEX. Quando esta opção é usada, o PostgreSQL deve executar duas varreduras da tabela e, além disso, deve aguardar o término de todas as transações existentes que poderiam modificar ou usar o índice. Portanto, este método requer mais trabalho total do que uma construção de índice padrão, levando muito mais tempo para ser concluído. Entretanto, como permite que as operações normais prossigam enquanto o índice é construído, este método é útil para adicionar novos índices em um ambiente de produção. Obviamente, a carga extra de CPU e E/S imposta pela criação do índice pode retardar outras operações.

Em uma construção de índice concorrente, o índice é, na verdade, inserido como um índice inválido nos catálogos do sistema em uma transação, e depois ocorrem duas varreduras da tabela em mais duas transações. Antes de cada varredura da tabela, a construção do índice deve aguardar o encerramento das transações existentes que modificaram a tabela. Após a segunda varredura, a construção do índice deve aguardar o término de qualquer transação que tenha um instantâneo anterior à segunda varredura (veja Controle de concorrência), incluindo as transações usadas por qualquer fase de construção de índice concorrente em outras tabelas, se os índices envolvidos forem parciais, ou tiverem colunas que não sejam simples referências de coluna. Então, finalmente o índice pode ser marcado como válido e pronto para uso, e o comando CREATE INDEX termina. Entretanto, mesmo assim, o índice pode não ser imediatamente utilizável pelas consultas: no pior caso, o índice não pode ser usado enquanto existirem transações anteriores ao início da construção do índice.

Se acontecer algum problema durante a varredura da tabela, como um impasse (deadlock), ou uma violação de unicidade em um índice de unicidade, o comando CREATE INDEX irá falhar, deixando para trás um índice inválido. Este índice será ignorado para fins de consulta, porque pode estar incompleto; entretanto, ainda consumirá sobrecarga de atualização. O meta-comando \d do psql irá mostrar este índice como INVALID:

postgres=# \d tab
       Table "public.tab"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 col    | integer |           |          |
Indexes:
    "idx" btree (col) INVALID

O método de recuperação recomendado nesses casos é excluir o índice e tentar executar novamente o comando CREATE INDEX CONCURRENTLY. (Outra possibilidade, é reconstruir o índice usando o comando REINDEX INDEX CONCURRENTLY).

Outra ressalva ao criar um índice de unicidade concorrente, é que a restrição de unicidade já está sendo imposta a outras transações quando a segunda varredura da tabela começa. Isto significa que podem ser relatadas violações de restrição em outras consultas, antes do índice ficar disponível para uso, ou mesmo nos casos onde a criação do índice eventualmente falha. Além disso, se ocorrer uma falha na segunda varredura, o índice inválido continuará a impor sua restrição de unicidade posteriormente.

Há suporte para construções concorrentes de índices de expressão e índices parciais. Os erros ocorridos na avaliação dessas expressões podem causar um comportamento semelhante ao descrito acima para violações de restrição de unicidade.

As construções de índices regulares permitem que ocorram outras construções de índices regulares na mesma tabela ao mesmo tempo, mas só pode haver uma construção de índice concorrente em uma tabela por vez. Nos dois casos, a modificação do esquema da tabela não é permitida enquanto o índice está sendo construído. Outra diferença, é que um comando CREATE INDEX regular pode ser executado dentro de um bloco de transação, mas o comando CREATE INDEX CONCURRENTLY não pode.

No momento, não há suporte para construção concorrente de índice em tabela particionada. Entretanto, é possível criar ao mesmo tempo o índice de cada partição individual e, finalmente, criar o índice particionado sem concorrência para reduzir o tempo em que a escrita na tabela particionada vai ficar bloqueada. Neste caso, a construção do índice particionado é uma operação somente de metadados.

Notas

Veja Índices para obter informações sobre quando os índices podem ser usados, quando não são usados, e em quais situações específicas podem ser úteis.

No momento, apenas os métodos de índice B-tree, GiST, GIN e BRIN dão suporte a índices com chave de várias colunas. A existência de várias colunas-chave é independente de poderem ser adicionadas as colunas do INCLUDE ao índice. Os índices podem ter até 32 colunas, incluindo colunas do INCLUDE. (Este limite pode ser alterado ao construir o PostgreSQL.) No momento, apenas Árvore-B oferece suporte a índices de unicidade.

Pode ser especificada uma classe de operador com parâmetros opcionais para cada coluna de um índice. A classe de operador identifica os operadores a serem usados pelo índice dessa coluna. Por exemplo, um índice de Árvore-B em números inteiros de quatro bytes usaria a classe int4_ops; esta classe de operador inclui funções de comparação para inteiros de quatro bytes. Na prática, a classe de operador padrão para o tipo de dados da coluna é geralmente suficiente. O ponto principal de ter classes de operador é que, para alguns tipos de dados, pode haver mais de uma ordenação significativa. Por exemplo, pode-se querer ordenar o tipo de dados de número complexo por seu valor absoluto, ou pela sua parte real. Isto pode ser feito definindo duas classes de operador para o tipo de dados, e selecionando a classe adequada ao criar o índice. Mais informações sobre classes de operador pode ser encontradas em Classes e famílias de operador e Interligando extensões a índices.

Quando o comando CREATE INDEX é executado em uma tabela particionada, o comportamento padrão é percorrer a todas as partições para garantir que todas tenham índices correspondentes. Primeiro, cada partição é verificada para determinar se já existe um índice equivalente e, em caso afirmativo, este índice será anexado como índice de partição ao índice que está sendo criado, que se tornará seu índice pai. Se não existir nenhum índice correspondente, será criado um índice e anexado automaticamente; o nome do novo índice de cada partição será determinado como se nenhum nome de índice tivesse sido especificado no comando. Se for especificada a opção ONLY, nenhuma recursividade será feita, e o índice será marcado como inválido. (O comando ALTER INDEX ... ATTACH PARTITION marca o índice como válido, uma vez que todas as partições tenham adquirido índices correspondentes.) Note, no entanto, que qualquer partição criada no futuro usando o comando CREATE TABLE ... PARTITION OF terá automaticamente um índice correspondente, independentemente de ONLY ser especificado.

Para métodos de índice com suporte a varreduras ordenadas (no momento, apenas B-tree), podem ser especificadas as cláusulas opcionais ASC, DESC, NULLS FIRST, e/ou NULLS LAST para modificar a ordem de classificação do índice. Uma vez que um índice ordenado pode ser varrido para frente ou para trás, normalmente não é útil criar um índice DESC de coluna única — esta ordem de classificação já está disponível com um índice regular. O valor dessas opções é que índices de várias colunas podem ser criados para corresponder à ordem de classificação solicitada por uma consulta de ordem mista, como SELECT ... ORDER BY x ASC, y DESC. As opções NULLS são úteis se for necessário oferecer suporte ao comportamento nulos são menores, em vez do padrão nulos são maiores, em consultas que dependem de índices para evitar etapas de classificação.

O sistema coleta regularmente estatísticas em todas as colunas da tabela. Os índices sem expressão recém-criados podem usar imediatamente estas estatísticas para determinar a utilidade do índice. Para novos índices de expressão, é necessário executar o comando ANALYZE, ou aguardar para que Autovacuum analise a tabela e gere estatísticas para estes índices.

Enquanto CREATE INDEX está executando, o search_path foi temporariamente alterado para pg_catalog, pg_temp.

Para a maioria dos métodos de índice, a velocidade de criação de um índice depende da configuração do parâmetro maintenance_work_mem. Valores maiores reduzem o tempo necessário para a criação do índice, desde que não se torne maior do que a quantidade de memória realmente disponível, o que levaria a máquina a paginar.

O PostgreSQL pode construir índices enquanto aproveita várias CPUs para processar as linhas da tabela mais rapidamente. Este recurso é conhecido como construção de índice em paralelo. Para métodos de índice que suportam a construção de índices em paralelo (no momento, apenas B-tree, GIN e BRIN), o parâmetro maintenance_work_mem especifica a quantidade máxima de memória que pode ser usada por cada operação de construção do índice como um todo, independentemente de quantos processos trabalhadores foram iniciados. Geralmente, o modelo de custo determina automaticamente quantos processos trabalhadores devem ser solicitados, se houver.

Construções de índice em paralelo podem se beneficiar do aumento do parâmetro maintenance_work_mem, onde uma construção de índice serial equivalente terá pouco ou nenhum benefício. Note que o valor de maintenance_work_mem pode influenciar o número de processos trabalhadores solicitados, já que os trabalhadores em paralelo devem ter pelo menos um compartilhamento de 32MB do valor total de maintenance_work_mem. Também deve haver um compartilhamento 32 MB restante para o processo líder. Aumentar max_parallel_maintenance_workers pode permitir que mais trabalhadores sejam usados, reduzindo o tempo necessário para a criação do índice, desde que a construção do índice já não esteja presa à E/S. Obviamente, também deve haver capacidade de CPU suficiente que, de outra forma, ficaria ociosa.

Definir o valor de parallel_workers via ALTER TABLE controla diretamente quantos processos trabalhadores em paralelo serão solicitados por um comando CREATE INDEX na tabela. Isto ignora completamente o modelo de custo, evitando que maintenance_work_mem afete quantos trabalhadores paralelos são solicitados. Definir parallel_workers como zero por meio do comando ALTER TABLE, desativa as construções de índice em paralelo na tabela em todos os casos.

Dica

Pode-se desejar restaurar parallel_workers após configurá-lo como parte do ajuste de uma construção de índice. Isto evita mudanças inadvertidas nos planos de consulta, já que parallel_workers afeta todas as varreduras de tabela em paralelo.

Embora o comando CREATE INDEX com a opção CONCURRENTLY dê suporte a construções em paralelo sem restrições especiais, apenas a primeira varredura de tabela é realmente executada em paralelo.

Deve ser usado o comando DROP INDEX para remover um índice.

Como qualquer transação de execução longa, o comando CREATE INDEX em uma tabela pode afetar quais tuplas podem ser removidas por um comando VACUUM simultâneo em qualquer outra tabela.

Versões anteriores do PostgreSQL também tinham o método de índice R-tree. Este método foi removido, porque não tinha vantagens significativas sobre o método GiST. Se for especificado USING rtree, o comando CREATE INDEX irá interpretá-lo como USING gist, para simplificar a conversão de bancos de dados antigos para GiST.

Cada processo servidor executando o comando CREATE INDEX irá relatar o seu progresso na visão pg_stat_progress_create_index. Veja Relatório de progresso do CREATE INDEX para obter detalhes.

Exemplos

Para criar um índice de unicidade Árvore-B na coluna title da tabela films:

CREATE UNIQUE INDEX title_idx ON films (title);

Para criar um índice de unicidade Árvore-B na coluna title, com as colunas incluídas director e rating, na tabela films:

CREATE UNIQUE INDEX title_idx ON films (title) INCLUDE (director, rating);

Para criar um índice Árvore-B com deduplicação desativada:

CREATE INDEX title_idx ON films (title) WITH (deduplicate_items = off);

Para criar um índice na expressão lower(title), permitindo procuras eficientes que não diferenciam letras maiúsculas de minúsculas:

CREATE INDEX ON films ((lower(title)));

(Neste exemplo, optou-se por omitir o nome do índice, então o sistema irá escolher um nome, normalmente films_lower_idx.)

Para criar um índice com ordenação diferente do padrão:

CREATE INDEX title_idx_german ON films (title COLLATE "de_DE");

Para criar um índice com ordem de classificação diferente do padrão para nulos:

CREATE INDEX title_idx_nulls_low ON films (title NULLS FIRST);

Para criar um índice com fator de preenchimento diferente do padrão:

CREATE UNIQUE INDEX title_idx ON films (title) WITH (fillfactor = 70);

Para criar um índice GIN com atualizações rápidas desativadas:

CREATE INDEX gin_idx ON documents_table USING GIN (locations) WITH (fastupdate = off);

Para criar um índice na coluna code da tabela films, e fazer com que o índice resida no espaço de tabelas indexspace:

CREATE INDEX code_idx ON films (code) TABLESPACE indexspace;

Para criar um índice GiST em atributo de ponto, para ser possível usar operadores de caixa com eficiência no resultado da função de conversão:

CREATE INDEX pointloc
    ON points USING gist (box(location,location));
SELECT * FROM points
    WHERE box(location,location) && '(0,0),(1,1)'::box;

Para criar um índice sem bloquear escrita na tabela:

CREATE INDEX CONCURRENTLY sales_quantity_index ON sales_table (quantity);

Conformidade

O comando CREATE INDEX é uma extensão do PostgreSQL à linguagem SQL. Não existe provisionamento para índices no padrão SQL.

Consulta

As informações sobre cada índice no banco de dados podem ser consultadas através da visão do sistema pg_indexes.

Veja também

ALTER INDEX, DROP INDEX, REINDEX, Relatório de progresso do CREATE INDEX


[132] INCLUDE: Esta palavra-chave apresenta uma cláusula que especifica colunas adicionais a serem anexadas ao conjunto de colunas de chave do índice. Quaisquer colunas incluídas nesta cláusula não são usadas para impor a unicidade. Estas colunas incluídas podem melhorar o desempenho de algumas consultas por meio do acesso somente ao índice. As colunas devem ser distintas das colunas usadas para impor a unicidade. UNIQUE deve ser especificado quando INCLUDE for especificado. IBM DB2 12.1.x – CREATE INDEX statement (N. T.)