Usuário com melhor resposta
Mais de um index por coluna

Pergunta
-
Pessoal tenho uma tabela que tem a mesma coluna em mais de um indice, isso pode causar problemas de performance?
Uma tabela com muitos indeces causa lentidão nos inserts e updates, mas eles podem causar lentidão na hora da consulta?
Obrigado
Respostas
-
Olá Fabiano,
Como você disse, no INSERT e UPDATE com certeza irá diminuir a performance por ter que atualizar os dados do índice.
Agora, para SELECT, a única tarefa necessária para o SQL será avaliar qual a melhor forma de executar a consulta, vai analisar os índices disponíveis e através das estatísticas definir qual terá melhor performance e criar o plano de execução. Quando criado o plano, este irá permanecer na memória, principalmente se a consulta é muito usada. A criação do plano irá consumir desempenho sim, mas depois de criado, irá ser reutilizado, não consumindo mais desempenho.
Espero ter cooperado.
Abraço
-
Alexandre,
Me desculpe, mas quem não concorda agora sou eu.
Pois acredito que o Fabiano, deve conhecer melhor do que nós a sua estrutura, se existe dois índices na mesma coluna, algum motivo levou a fazer isso, realmente ele deve fazer uma análise sim, mas nunca é demais dizer que um índice mau projetado, ou seja, sem necessidade pode atrapalhar sim a performance.
Respeito a sua opinião e conhecimento.
Todas as Respostas
-
Olá Fabiano,
Como você disse, no INSERT e UPDATE com certeza irá diminuir a performance por ter que atualizar os dados do índice.
Agora, para SELECT, a única tarefa necessária para o SQL será avaliar qual a melhor forma de executar a consulta, vai analisar os índices disponíveis e através das estatísticas definir qual terá melhor performance e criar o plano de execução. Quando criado o plano, este irá permanecer na memória, principalmente se a consulta é muito usada. A criação do plano irá consumir desempenho sim, mas depois de criado, irá ser reutilizado, não consumindo mais desempenho.
Espero ter cooperado.
Abraço
-
-
Junior é o seguinte, estou fazendo a analise de um banco e verifiquei que algumas tabelas tem mais de um indice na mesma coluna.
Por ex:
create clustered index indx_1 on tabela(a)
create index indx_2 on tabela(a,b)
create index indx_3 on tabela(a,c)
ou então
create index indx_4 on tabela(b)
create index indx_5 on tabela(b,x)
Vamos analisar o seguinte, os indices 2,3 e 5 são reduntantes concorda? Porque se eu remover estes indices o processo automaticamente ira passar a usar os indices 1 e 4.
Estou certo?
Obrigado galera.
-
-
Fabiano,
Não concordo completamente com sua colocação.
Você não pode simplesmente dizer que os índices são redundantes olhando para eles. É necessário que se analise quais consultas estão sendo feitas sobre esta tabela e principalmente quais colunas estão sendo usadas dentro de clausulas WHERE e também usadas para associação, em JOINS.
Recomendo que primeiro faça a captura de consultas que usam esta sua tabela e então veja se não existe alguma consulta que possa estar usando especificamente os índices que você está querendo descartar.
Outro detalhe muito importante é procurar saber se esta sua tabela é mais usada para fazer INSERT/UPDATE ou para consultas. Se é usada mais para leitura, em alguns casos vale a pena ter um custo maior na manutenção para então obter um desempenho superior nas consultas.
Resumindo, você terá que conhecer bem os dados e principalmente como eles são usados.
Abraço
-
Alexandre,
Me desculpe, mas quem não concorda agora sou eu.
Pois acredito que o Fabiano, deve conhecer melhor do que nós a sua estrutura, se existe dois índices na mesma coluna, algum motivo levou a fazer isso, realmente ele deve fazer uma análise sim, mas nunca é demais dizer que um índice mau projetado, ou seja, sem necessidade pode atrapalhar sim a performance.
Respeito a sua opinião e conhecimento.
-
-
Junior e Alexandre,
Obrigado pelas respostas,
Alexandre concordo com você quando diz que será necessário analisar quais as consultas estão sendo executadas na tabelas.
Podemos imaginar o seguinte senário.
select b,x from tabela
where x = 10
Neste caso o indice 5 seria util, pois o SQL leria apenas o indice para obter as informações.
Estou analisando caso a caso para ter certeza do que fazer.
Novamente obrigado Junior e Alexandre.
-
Fabiano,
É, exatamente isso. Esse é um trabalho que exige uma certa paciência e calma, pois é necessário analisar a combinação de várias consultas, etc.
O Profiler pode lhe auxiliar, capturando cerca de uma hora de instruções, e depois basta submeter estar ao Database Tuning Advisor.
Qualquer coisa estamos aí.
Abraço