none
Indice não é utilizado RRS feed

  • Pergunta

  • Ola pessoal

    --

    tenho uma tabela de movimentação, com um consideravel numero de registros. 

    Criei um indice para a coluna CodCliente, mas, analisando junto ao Plano de Execucação, verifica-se-se que ele não é utilizado.

    --

    Exemplos de querys que testei:

    select * from Notas order by codCliente

    O plano de execução fica:  Clustered Index Scan (PK_Notas) 10%... Sort: 81% ... Paralelismo: 8%

    --

    select codcliente, SUM(n.ValorTotal) from Notas n

    group by CodCliente
    order by CodCliente

    O plano de execução fica: Clustered index scan (PK_Notas): 97%

    Hash Match: 3%

    Paralelismo e Sort: 0%


    --


    atualizei estatisticas, pensando que poderia ser algo do genero:

    UPDATE STATISTICS Notas

    Mas nada.. mesma coisa. 

    A chave fisica (indice clusterizado) da tabela é uma coluna ID bigint identity(1,1)

    --

    Sera que é algo relacionado ao volume de dados, que, por não ter filtros (where) acaba achando a melhor opção o Index Scan na chave clusterizada, mesmo?


    Julio C.

    segunda-feira, 15 de abril de 2013 17:52

Respostas

  • Olá Júlio, Então quando você fez a seguinte query

    select * from Notas order by codCliente

    Realmente acredito que ele não vá percorrer o index, por que ele tem que fazer um Scan na tabela para retornar os dados.

    tenta utilizar o Database Engine Tuning Advisor que é muito útil para analisar os índices existentes.

    Espero que eu tenha te ajudado.


    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta Julio Costi terça-feira, 16 de abril de 2013 15:11
    segunda-feira, 15 de abril de 2013 18:11
  • Julio,

    A ideia é exatamente essa. Não leve o percentual como sendo um valor fixo, ele é o CUSTO que o SQL Server teve para retornar os teus dados, dentre todos os demais passos envolvidos.

    Quando você fez a consulta sem nenhum filtro no where, o SQL Server entende que precisa buscar todos os dados da tabela. Desta forma, ele não faz um SEEK porque simplesmente não tem o que buscar... ele acaba fazendo um SCAN na tua tabela. Se ela tiver um índice cluster, fará um clustered scan. Se não tiver, fará um table scan.

    Quando você fez um WHERE pelo campo que faz parte do teu indice cluster, o SQL Server vai direto no ponto desejado, utilizando o índice. 

    Espero ter ajudado.

    []'s

    • Sugerido como Resposta Alexandre Matayosi segunda-feira, 15 de abril de 2013 20:51
    • Marcado como Resposta Julio Costi terça-feira, 16 de abril de 2013 15:11
    segunda-feira, 15 de abril de 2013 18:52
  • Deleted
    • Marcado como Resposta Julio Costi terça-feira, 16 de abril de 2013 16:48
    terça-feira, 16 de abril de 2013 16:05
  • Olá Julio.

    O Database Engine Tuning Advisor faz parte do SQL Server sim, acredito que a partir do 2005 e somente nas versões Enterprise.

    Espero ter ajudado.



    • Editado Eric Malzone terça-feira, 16 de abril de 2013 20:22
    • Marcado como Resposta Julio Costi terça-feira, 16 de abril de 2013 21:43
    terça-feira, 16 de abril de 2013 20:07

Todas as Respostas

  • Opa, 

    testei usando filtro de codCliente na clausula Where, e daí realmente USA o indice do cliente... PORÉM, o custo fica 0%

    fica 99% para a leitura do indice clusterizado, 0% do IX_CodCliente

    é assim mesmo?


    Julio C.

    segunda-feira, 15 de abril de 2013 17:55
  • Olá Júlio, Então quando você fez a seguinte query

    select * from Notas order by codCliente

    Realmente acredito que ele não vá percorrer o index, por que ele tem que fazer um Scan na tabela para retornar os dados.

    tenta utilizar o Database Engine Tuning Advisor que é muito útil para analisar os índices existentes.

    Espero que eu tenha te ajudado.


    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta Julio Costi terça-feira, 16 de abril de 2013 15:11
    segunda-feira, 15 de abril de 2013 18:11
  • Julio,

    A ideia é exatamente essa. Não leve o percentual como sendo um valor fixo, ele é o CUSTO que o SQL Server teve para retornar os teus dados, dentre todos os demais passos envolvidos.

    Quando você fez a consulta sem nenhum filtro no where, o SQL Server entende que precisa buscar todos os dados da tabela. Desta forma, ele não faz um SEEK porque simplesmente não tem o que buscar... ele acaba fazendo um SCAN na tua tabela. Se ela tiver um índice cluster, fará um clustered scan. Se não tiver, fará um table scan.

    Quando você fez um WHERE pelo campo que faz parte do teu indice cluster, o SQL Server vai direto no ponto desejado, utilizando o índice. 

    Espero ter ajudado.

    []'s

    • Sugerido como Resposta Alexandre Matayosi segunda-feira, 15 de abril de 2013 20:51
    • Marcado como Resposta Julio Costi terça-feira, 16 de abril de 2013 15:11
    segunda-feira, 15 de abril de 2013 18:52
  • Opa, muito obrigado! ajudaram sim

    na realidade, era um teste, justamente pq estou tentando entender melhor o funcionamento dessa parte das consultas.

    Só para referencia, fica um post que achei, praticamente uma aula do Gustavo Maia (e outros tambem), que tambem exclareceu muito.

    http://social.msdn.microsoft.com/Forums/pt-BR/520/thread/f8725d55-460c-44ba-9b1f-8f0775497a40

    --

    em outros posts ja ouvi falar muito de tuning de querys, esse programa citado é parte do SQL Server? como o encontro?

    Obrigado, mesmo!!


    Julio C.

    terça-feira, 16 de abril de 2013 15:14
  • Deleted
    • Marcado como Resposta Julio Costi terça-feira, 16 de abril de 2013 16:48
    terça-feira, 16 de abril de 2013 16:05
  • Ola José!

    Entendo.. mas me referi na verdade ao programa que o amigo citou anteriormente, "Database Engine Tuning Advisor"

    Mas valeu pela sugestão de leitura ;)

    Obrigado!


    Julio C.

    terça-feira, 16 de abril de 2013 16:48
  • Olá Julio.

    O Database Engine Tuning Advisor faz parte do SQL Server sim, acredito que a partir do 2005 e somente nas versões Enterprise.

    Espero ter ajudado.



    • Editado Eric Malzone terça-feira, 16 de abril de 2013 20:22
    • Marcado como Resposta Julio Costi terça-feira, 16 de abril de 2013 21:43
    terça-feira, 16 de abril de 2013 20:07