none
Actual Number of Rows ou Estimated Number of Rows? RRS feed

  • Discussão Geral

  • Pessoal,
    em uma certa tabela sem nenhum índice setorizado, eu fiz uma consulta e olhei no Query Execution Plan, o resultado foi um TABLE SCAN. Então decidi criar um Clustered Index  na coluna do WHERE, e o resultado foi um CLUSTERED INDEX SCAN. Depois fiz um DROP neste índice e criei outro, só que na coluna do SELECT, o resultado foi um CLUSTERED INDEX SEEK. 

    São três situações...a primeira, sem sombra de dúvida, foi a mais lenta, as demais tiveram desempenho igual. Mas, falando das demais observei quando pus o mouse na parte do CLUSTERED INDEX SCAN, que o ACTUAL NUMBER OF ROWS ficou menor que o ESTIMATED NUMBER OF ROWS.. até aí eu tinha entendido que quanto mais você diminuir o número de linhas atuais seria melhor, porém quando rodei a consulta novamente, coloquei o mouse na parte do CLUSTERED INDEX SEEK, e vi que o numero de linhas estimado era 1 e o número de linhas atuais era do tamanho da tabela.

    Levaremos em consideração esta consulta:

    SELECT cod_livro FROM itens_da_compra WHERE cod_compra = 57
    Adicionando o índice da coluna do SELECT (caso do CLUSTERED INDEX SCAN):
    CREATE CLUSTERED INDEX indice_teste1 ON itens_da_compra(cod_livro)
    Actual Number of Rows = 44622
    Estimated Number of Rows = 60059

    Adicionando o índice da coluna do WHERE (caso do CLUSTERED INDEX SEEK):

    CREATE CLUSTERED INDEX indice_teste2 ON itens_da_compra(cod_compra)
    Actual Number of Rows = 45742
    Estimated Number of Rows = 1

    Enfim, sabendo que os dois têm a mesmo desempenho...
    o que deve ser levado em consideração na leitura do Query Execution Plan é a Actual ou Estimated Number of Rows?

    Abraço

    segunda-feira, 9 de novembro de 2009 17:22

Todas as Respostas

  • Alan,

    Qual o SQL Server realizar um Seek seja em um clustered Index ou Index Seek, isso significa que o SQL Server esta fazendo uso de uma pequena parcela de dados da sua table, tanto do Clustered Index Scan como também o Clustered Index Seek são mecanismos de busca de informações mais inteligentes e rápidas em relação ao Table Scan.

    Agora deixa eu te perguntar um coisa, você disse que havia criado um clustered index e depois excluiu este índice criando outro em outra coluna, este 
    índice criado por acaso foi um nonclustered index?


    Você executou a mesma query nas três situações?


    Um detalhe importante é o Estimated Number Rows, essa informação quanto maior foi seu valor maior será a necessidade que o SQL Server supostamente vai realizar a leitura de dados para retornar a informações, isso é muito comum de acontecer quando estamos passando variávies como parâmetros em nossas querys!!!
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 10 de novembro de 2009 23:14
    Moderador
  • Isso, boa explicação Galvão!

    Respondendo a sua pergunta, eu criei um Clustered Index mesmo.
    E sim, executei a query nas três situações.

    Em relação ao Estimated Number of Rows, ficou claro a sua explicação, eu só não sabia qual levar em consideração...se era o Estimated ou o Actual.
    Mas com a sua explicação e mais algumas outras que obtive, tirei a seguinte conclusão:

    O Estimated Number of Rows é realmente quanto o Query Optimizer "acha" que vai retornar na consulta, isso está diretamente relacionado com a manutenção das estatísticas, ou seja, mantê-las atualizadas.
    E o Actual Number of Rows é quanto de fato é retornado na consulta.

    Enfim, os índices setorizados caminham em paralelo com as estatísticas.

    Farei alguns testes e postarei para vocês visualizarem aqui!


    Sobre as estatísticas, segue link bem interessante.

    Abraço!
    sábado, 14 de novembro de 2009 14:53
  • Alan,

    Obrigado pelo retorno, qualquer dúvida fico a disposição.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    sábado, 14 de novembro de 2009 21:03
    Moderador