Como sei quais índices criar para uma tabela?

33

Existe uma maneira de descobrir a melhor maneira de saber quais índices criar para uma tabela?

Nick Ginanto
fonte
11
Há sim. Tente use-the-index-luke.com por exemplo.
Dezso
A resposta que eu mais vi é que você deve indexar chaves primárias e colunas usadas nas WHEREcláusulas.
Oskar Persson
Por favor, não faça isso. Uma chave primária define como os dados são classificados fisicamente na tabela e possui suas próprias considerações. Você precisa escolher a chave primária com muito cuidado, pois ela também é usada em todos os seus outros índices. Veja como: sqlskills.com/blogs/kimberly/…
Ali Razeghi 6/13
4
@AliRazeghi Isso (classificação física) é verdade em determinados DBMSes (sob certas circunstâncias) e não em outros. Por exemplo, não é verdade no PostgreSQL.
Dezso
Votação de volta!
Ali Razeghi

Respostas:

29

Regras curtas. (Alguns deles são criados automaticamente, mas podem ser eliminados manualmente mais tarde, dependendo dos dbms. Não pense que você sempre trabalhará no PostgreSQL.)

  • Indexar todas as chaves primárias.
  • Indexar todas as chaves estrangeiras.
  • Indexe todas as colunas usadas em uma cláusula JOIN.
  • Indexe todas as colunas usadas em uma cláusula WHERE.
  • Estude sua documentação para aprender as opções de indexação "esotéricas" que seu dbms suporta.

Cada chave primária significa que as chaves primárias de várias colunas devem ter um único índice cobrindo todas as colunas. O PostgreSQL criará esse índice automaticamente se você declarar uma chave primária de várias colunas.

Existem muitos casos em que um único índice de várias colunas oferece um desempenho melhor do que vários índices de uma única coluna. Monitore consultas lentas e faça testes para descobrir qual é qual.

Suponha que qualquer alteração na indexação melhore algumas atividades do banco de dados e prejudique outras. Acho útil ter um conjunto de instruções SQL que eu possa criar um perfil antes e depois de fazer alterações nos índices. Este conjunto inclui instruções SELECT, INSERT, UPDATE e DELETE.

Não há substituto para estudar os documentos para seus dbms específicos.

  • CRIAR ÍNDICE
  • Índices (observe especialmente as seções sobre expressões de indexação, índices parciais e examinar o uso do índice)
Mike Sherrill 'Recolha de Gatos'
fonte
14

Além do que o @Catcall já forneceu , e para adicionar um pequeno corretivo:

Também cobri alguns princípios básicos nesta resposta intimamente relacionada ao SO recentemente .

As respostas até agora parecem indicar que você precisa criar índices nas chaves primárias, mas esse não é o caso no PostgreSQL (exceções parciais se aplicam). Cito o manual aqui :

O PostgreSQL cria automaticamente um índice exclusivo quando uma restrição exclusiva ou chave primária é definida para uma tabela. O índice abrange as colunas que compõem a chave primária ou restrição exclusiva (um índice de várias colunas , se apropriado) e é o mecanismo que impõe a restrição.

Negrito ênfase minha.

Você pode criar índices adicionais para a segunda ou mais colunas de um índice de várias colunas, mas a primeira geralmente é coberta por um índice de várias colunas - exceto quando colunas adicionais tornam o índice muito maior. Discutimos isso em detalhes na questão relacionada:

Um índice composto também é bom para consultas no primeiro campo?

Índices de várias colunas , índices parciais e índices de expressões são ferramentas particularmente poderosas no PostgreSQL. Desde o PostgreSQL 9.2, também existem varreduras apenas de índice , o equivalente a "cobertura de índices" em outros RDBMS. Esse não é outro tipo de índice, mas um novo recurso do RDBMS com os tipos de índice existentes.

Todo índice carrega custos específicos ; portanto, não há como contornar algum conhecimento básico para realmente otimizar a indexação. Apenas criar mais índices pode fazer mais mal do que bem. Em particular, os índices podem impedir que as atualizações HOT melhorem o desempenho.

Geralmente, as operações de gravação ( DELETE, UPDATE) ficam mais caras (mas também podem se beneficiar!), Enquanto as operações de leitura ( SELECT) geralmente se beneficiam. Muitos índices podem esgotar a memória cache, de modo que até as operações de leitura podem sofrer.

Finalmente, esta página do Postgres Wiki sobre manutenção de índice apresenta ferramentas para encontrar índices duplicados ou não utilizados (entre outras coisas).

Erwin Brandstetter
fonte
Se bem me lembro, o índice automático sobre PK também é criado no Oracle v.> = 10 e Sql Server> = 2008
EAmez
1

Existem duas opções.

  1. Faz você.
  2. A tecnologia faz isso.

A resposta para você mesmo é bastante exaustivamente documentada aqui. Então, vamos olhar para outra coisa.

Pghero

O Pghero pode ajudá-lo se você quiser alguns conselhos automatizados.

Dito isto, há algumas deficiências.

  1. Só funciona WHEREe ORDER BY, não JOINS.
  2. Ele usa apenas estatísticas sobre porcentagem NULL e valores distintos.

Confira este vídeo para mais informações .

Evan Carroll
fonte