CREATE INDEX — define um novo índice
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ]nome_do_índice] ON [ ONLY ]nome_da_tabela[ USINGmétodo] ( {nome_da_coluna| (expressão) } [ COLLATEordenaçã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] [, ... ] ) ] [ TABLESPACEnome_do_espaço_de_tabelas] [ WHEREpredicado]
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.
UNIQUEFaz 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.
CONCURRENTLYQuando 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_índiceO 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).
ONLYIndica não criar índices recursivamente não partições, se a tabela for particionada. O padrão é ser recursivo.
nome_da_tabelaO 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_colunaO nome da coluna da tabela.
expressãoUma 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çãoO 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_operadorO nome da classe de operador. Veja os detalhes abaixo.
parâmetro_de_classe_de_operadorO nome do parâmetro da classe de operador. Veja os detalhes abaixo.
ASCEspecifica a ordem de classificação ascendente (que é o padrão).
DESCEspecifica 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 DISTINCTNULLS NOT DISTINCTEspecifica 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_armazenamentoO 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_tabelasO 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.
predicadoA expressão de restrição para um índice parcial.
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.
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.
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.
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.
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.
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.
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);
O comando CREATE INDEX é uma extensão do
PostgreSQL à linguagem SQL.
Não existe provisionamento para índices no padrão SQL.
As informações sobre cada índice no banco de dados podem ser consultadas através da visão do sistema pg_indexes.
[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.)