none
Criar Indice RRS feed

  • Pergunta

  • Bom dia,

    Estou com a seguinte dúvida.

    Tenho uma tabela que possuí muitas colunas e nelas são geradas muitas consultas.

    Dúvida: Posso criar um único índice com muitas colunas para diversas consultas ou eu deveria criar um índice para cada consulta?

    Obrigado. 

    Denis

    quarta-feira, 25 de fevereiro de 2015 15:03

Respostas

  • Olá Denis!

    Avaliando as consultas, as colunas são comuns entre elas?

    Você pode ter dois cenários. Cenário 1:

    SELECT A,B,C WHERE B = xxxxx;
    SELECT A,C WHERE B = xxxxx;
    SELECT A,B WHERE B = xxxxx;


    Se eu indexo as colunas A, B e C ordenando pela coluna B, por exemplo, o SQL Server copia os dados dessas 3 colunas ordenados pela coluna B. Atenderia os predicados SELECT A, B, C WHERE B = xxxxx mas não atenderia SELECT A, B, C WHERE C = nnnnnnn. Para esta última você deve ter um índice ordenado pela coluna C, duplicando novamente os dados. Isso quer dizer que se você tem consultas que pedem colunas diferentes sempre WHERE B = xxxxx, aí sim um índice só atenderia todas as suas consultas, mas duplicaria sua tabela ordenando pela coluna B.

    Um Cenário 2 seria você ter consultas como:

    SELECT A, B, C WHERE B = xxxxxxx;
    SELECT A, B, C WHERE A = nnnnnn;
    SELECT A, B, C WHERE C = yyyyyyy;

    Aí um único índice não adiantaria, você deveria criar um índice com as 3 colunas ordenando pela coluna B, outro ordenando pela coluna A e um terceiro índice ordenando pela coluna C. Desta forma você ganha performance na consulta, porém, duplica os dados da tabela 3x.

    Sugiro que você verifique todas as colunas envolvidas nas consultas, quais consultas são mais executadas, para avaliar bem. Você deve avaliar se vale a pena criar um índice para uma consulta que roda 1 ou 2 vezes por mês.

    Lembre-se que criando índices você duplica dados, aumenta o tamanho da base e consequentemente aumenta o tamanho do backup, tempo de backup/restore, tempo de desfragmentação, CheckDB, etc.

    Cada índice não cluster que você cira, você duplica os dados indexados. 

    Ficou claro ou ainda tem mais alguma dúvida?


    Luiz Mercante | MCITP SQL 2008 | MCTS SQL 2008 | MTA Database Fundamentals | MCTS Windows Apps | MCTS Windows Network | MCP 2003 | sqldicas@outlook.com | http://sqldicas.com.br --> Se a resposta foi útil de alguma forma, classifique como resposta ou vote como útil.

    quarta-feira, 25 de fevereiro de 2015 18:00
    Moderador

Todas as Respostas

  • Denis,

    Basicamente você pode fazer isso sim, criar um índice com muitas colunas, chamado índice de performance ou índice de cobertura.

    Mas é necessário fazer uma análise no seu ambiente, as vezes o conceito de estatísticas filtradas ou indices com cláusula Where conhecido como índice filtrado podem ser uma solução.


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]



    quarta-feira, 25 de fevereiro de 2015 15:15
    Moderador
  • Olá Denis!

    Avaliando as consultas, as colunas são comuns entre elas?

    Você pode ter dois cenários. Cenário 1:

    SELECT A,B,C WHERE B = xxxxx;
    SELECT A,C WHERE B = xxxxx;
    SELECT A,B WHERE B = xxxxx;


    Se eu indexo as colunas A, B e C ordenando pela coluna B, por exemplo, o SQL Server copia os dados dessas 3 colunas ordenados pela coluna B. Atenderia os predicados SELECT A, B, C WHERE B = xxxxx mas não atenderia SELECT A, B, C WHERE C = nnnnnnn. Para esta última você deve ter um índice ordenado pela coluna C, duplicando novamente os dados. Isso quer dizer que se você tem consultas que pedem colunas diferentes sempre WHERE B = xxxxx, aí sim um índice só atenderia todas as suas consultas, mas duplicaria sua tabela ordenando pela coluna B.

    Um Cenário 2 seria você ter consultas como:

    SELECT A, B, C WHERE B = xxxxxxx;
    SELECT A, B, C WHERE A = nnnnnn;
    SELECT A, B, C WHERE C = yyyyyyy;

    Aí um único índice não adiantaria, você deveria criar um índice com as 3 colunas ordenando pela coluna B, outro ordenando pela coluna A e um terceiro índice ordenando pela coluna C. Desta forma você ganha performance na consulta, porém, duplica os dados da tabela 3x.

    Sugiro que você verifique todas as colunas envolvidas nas consultas, quais consultas são mais executadas, para avaliar bem. Você deve avaliar se vale a pena criar um índice para uma consulta que roda 1 ou 2 vezes por mês.

    Lembre-se que criando índices você duplica dados, aumenta o tamanho da base e consequentemente aumenta o tamanho do backup, tempo de backup/restore, tempo de desfragmentação, CheckDB, etc.

    Cada índice não cluster que você cira, você duplica os dados indexados. 

    Ficou claro ou ainda tem mais alguma dúvida?


    Luiz Mercante | MCITP SQL 2008 | MCTS SQL 2008 | MTA Database Fundamentals | MCTS Windows Apps | MCTS Windows Network | MCP 2003 | sqldicas@outlook.com | http://sqldicas.com.br --> Se a resposta foi útil de alguma forma, classifique como resposta ou vote como útil.

    quarta-feira, 25 de fevereiro de 2015 18:00
    Moderador