none
Mais de um index por coluna RRS feed

  • 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

    segunda-feira, 23 de julho de 2007 14:49

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

    segunda-feira, 23 de julho de 2007 15:51
  • 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.

     

    terça-feira, 24 de julho de 2007 12:53

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

    segunda-feira, 23 de julho de 2007 15:51
  • Fabiono,

     

    Concordo com o Alexandre!!!

     

    Mas qual o objetivo de uma mesma coluna ter mais de um índice?

    segunda-feira, 23 de julho de 2007 19:16
  • 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.

    terça-feira, 24 de julho de 2007 12:06
  • Fabiano,

     

    Isso mesmo, você esta certo.

     

     

    terça-feira, 24 de julho de 2007 12:24
  •  

    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

    terça-feira, 24 de julho de 2007 12:40
  • 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.

     

    terça-feira, 24 de julho de 2007 12:53
  •  

    Ok Junior,

     

    Abraço

    terça-feira, 24 de julho de 2007 13:14
  • 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.

    terça-feira, 24 de julho de 2007 20:26
  •  

    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

    terça-feira, 24 de julho de 2007 21:07