Pergunta

Ao trabalhar com tabelas no Oracle, como saber quando você está configurando um índice bom ou um índice ruim?

Foi útil?

Solução

Isso depende do que você entende por “bom” e “ruim”.Basicamente, você precisa perceber que cada índice adicionado aumentará o desempenho em qualquer pesquisa nessa coluna (portanto, adicionar um índice à coluna 'sobrenome' de uma tabela de pessoa aumentará o desempenho em consultas que contenham "where lastname ="), mas diminuir o desempenho de gravação em toda a tabela.

A razão para isso é que quando você adiciona ou atualiza uma linha, ela deve adicionar ou atualizar a própria tabela e cada índice do qual a linha é membro.Portanto, se você tiver cinco índices em uma tabela, cada adição deverá ser escrita em seis casas - cinco índices e a tabela - e uma atualização poderá tocar até seis casas no pior caso.

A criação de índice é um ato de equilíbrio entre a velocidade de consulta e a velocidade de gravação.Em alguns casos, como um datamart que só é carregado com dados uma vez por semana em um trabalho noturno, mas consultado milhares de vezes diariamente, faz muito sentido sobrecarregar com índices e acelerar as consultas tanto quanto possível.No entanto, no caso de sistemas de processamento de transações on-line, você deseja tentar encontrar um equilíbrio entre eles.

Resumindo, adicione índices às colunas que são muito usadas em consultas selecionadas, mas tente evitar adicionar muitos e, portanto, adicione as colunas mais usadas primeiro.

Depois disso, é uma questão de testes de carga para ver como o desempenho reage sob condições de produção e muitos ajustes para encontrar um equilíbrio aceitável.

Outras dicas

Campos diversos, altamente específicos ou exclusivos são bons índices.Como datas e carimbos de data e hora, números incrementais exclusivos (comumente usados ​​como chaves primárias), nomes de pessoas, números de placas de veículos, etc.

Um contra-exemplo seria gênero - existem apenas dois valores comuns, portanto o índice não ajuda realmente a reduzir o número de linhas que devem ser verificadas.

Strings descritivas completas de formato livre geram índices ruins, pois quem está realizando a consulta raramente sabe o valor exato da string.

Dados ordenados linearmente (como carimbos de data/hora ou datas) são comumente usados ​​como um índice clusterizado, o que força as linhas a serem armazenadas na ordem do índice e permite o acesso em ordem, acelerando bastante as consultas de intervalo (por exemplo,'dê-me todos os pedidos de venda entre outubro e dezembro').Nesse caso, o mecanismo do banco de dados pode simplesmente buscar o primeiro registro especificado pelo intervalo e começar a ler sequencialmente até atingir o último.

Aqui está um ótimo artigo do SQL Server:http://www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx

Embora a mecânica não funcione no Oracle, as dicas são muito apropriadas (menos a questão dos índices clusterizados, que não funcionam da mesma maneira no Oracle).

@Infamous Cow - você deve estar pensando em chaves primárias, não em índices.

@Xenph yan - algo que os outros não tocaram é escolher o que tipo de índice a ser criado.Alguns bancos de dados não oferecem muita escolha, mas alguns têm uma grande variedade de índices possíveis.As árvores B são as padrão mas nem sempre é o melhor tipo de índice.A escolha da estrutura certa depende do tipo de uso que você espera ter.Que tipo de consultas você mais precisa apoiar?Você está em um ambiente de leitura ou escrita?Suas gravações são dominadas por atualizações ou acréscimos?Etc etc.

Uma descrição dos diferentes tipos de índices e seus prós e contras está disponível aqui: http://20bits.com/2008/05/13/interview-questions-database-indexes/ .

Algumas regras básicas se você estiver tentando melhorar uma consulta específica.

Para uma tabela específica (onde você acha que o Oracle deveria começar), tente indexar cada uma das colunas usadas na cláusula WHERE.Coloque colunas com igualdade primeiro, seguidas por colunas com intervalo ou algo semelhante.

Por exemplo:

WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200

Se as colunas forem muito grandes (por ex.você está armazenando algum XML ou algo assim), talvez seja melhor deixá-los fora do índice.Isso tornará o índice menor para varredura, supondo que você precise ir até a linha da tabela para satisfazer a lista de seleção de qualquer maneira.

Alternativamente, se todos os valores nas cláusulas SELECT e WHERE estiverem no índice, o Oracle não precisará acessar a linha da tabela.Portanto, às vezes é uma boa ideia colocar os valores selecionados por último no índice e evitar o acesso à tabela todos juntos.

Você poderia escrever um livro sobre as melhores maneiras de indexar - procure o autor Jonathan Lewis.

Um bom índice é algo em que você pode confiar que será exclusivo para uma linha específica da tabela.

Um esquema de índice comumente usado é o uso de números que aumentam 1 para cada linha da tabela.Cada linha acabará tendo um índice numérico diferente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top