t
Por Thiago Pastorello Gervazoni
tpastorello@yahoo.com.br
Bacharel e formado em matemática e ciências da computação. Desenvolvedor a 7 anos, analista de sistemas na Deloitte Touche, desenvolve com a plataforma .NET. Possui certificação MCAD e MCDBA e ministra palestras pela Microsoft. http://br.thespoke.net/myblog/Tpastorello/myblog.aspx

Melhorando a performance através das estatísticas

Ao procurarmos  uma informação em uma lista telefônica por exemplo, primeiro identificamos alguma informação relevante como sobrenome, e depois tentamos encontrar dentre os do mesmo sobrenome o possível número que nos interessa. Isto na maioria das vezes realizamos automaticamente porquê queremos encontrar a informação em menor tempo e com assertividade.

 

Nos bancos de dados entretanto o que parece ser tão diferente do descrito acima ao buscar uma informação, na verdade, é bastante similar.

 

O SQL Server busca a informação de duas maneiras, table scan e através de índices.

Porém mesmo se uma tabela não possua ou não índices, o SQL armazena estatísticas de cada campo, principalmente dos mais acessados, e para otimizar a busca da informação, para tal o query optimizer utiliza-se primeiro das estatísticas para montar seu plano de execução.

 

Existem alguns motivos de lentidão em queries como segue abaixo :

·        Baixa velocidade de comunicação na rede

·        Memória inadequada no servidor

·        Falta de estatísticas

·        Estatísticas desatualizadas

·        Falta de índices

·        Índices desatualizados

 

Nesta coluna cobriremos o assunto relacionado a estatísticas.

Antes do SQL optar por usar um índice ele lê as estatísticas dos campos a fim de encontrar o índice que será mais útil e rápido para chegar até a informação (exemplo da lista telefônica). É possível ter as tabelas com índices não desfragmentados e criados corretamente e ainda assim não ter total rendimento na busca da informação.

 

A explicação para isto é que o SQL está trabalhando perfeitamente com suas tabelas indexadas, até com índices compostos que são ótimos para a performance, porém com as estatísticas desatualizadas, fazendo com que o SQL opte pelo índice que não é a melhor escolha, por default quando instalamos o SQL existe a opção de criação e atualização automática de estatísticas default. Figura1, porém o SQL espera o acúmulo de algumas modificações para realizar a atualização automática, levando também em consideração o tamanho da tabela, até 8mb as estatísticas são atualizadas com mais freqüência, com mais de 8mb este intervalo aumenta consideravelmente. Podendo então ser atualizadas manualmente.

 

Figura 1 . Parâmetros default na instalação do SQL, auto create e update statistics

 

 

Identificando se as estatísticas estão desatualizadas

Ao inserir muitos registros as estatísticas acabam ficando desatualizadas, como teste eu executei uma stored procedure de consulta com o Show Execution Plan ligado, esta é uma ferramenta muito útil do query Analyzer, principalmente para a manutenção de índices e estatísticas, no nosso caso veremos as estatísticas.

 

Figura 2 . Execução de uma stored procedure com o Show Execution Plan ligado.

 

CREATE PROCEDURE nort_cust_s(@ContactName varchar(30))

AS

BEGIN

  SELECT customerID,CompanyName,ContactName FROM Customers WHERE ContactName=@ContactNAme

END

 

Podemos ver na figura 3, que teve um alto custo para a execução da query  (Cost 100%), ou seja muito processamento para a busca da informação, uma porcentagem tolerável seria até no máximo 10%, isto é devido à falta de índices ou estatísticas desatualizadas.

Atente agora para o medidor (Estimated row count  999), isto significa que o SQL esperava desta tabela o retorno de 999 registros, na sentença SQL que passei para ele, informação esta que as estatísticas é responsável por armazenar, porém na realidade está retornando muito mais registros do que  o esperado (Row count 2.499) 2.499 registros.

 

Figura 3 . Detalhes do plano de execução.

 

Precisamos neste caso atualizar as estatísticas, existem alguns motivos que levam a atualizar as estatísticas, como segue :

 

·        Muitas alterações em key values de índices

·        Adição de muitos registros

·        Remoção de muitos registros

·        Quando a tabela é truncada (truncate table)

 

 

Atualizando as estatísticas

É possível atualizar estas estatísticas com os comandos.

 

 UPDATE STATISTICS table | view
    [
        index
        | ( statistics_name [ ,...n ] )

    ]  WITH FULLSCAN

  Atualiza as estatísticas em uma tabela isoladamente, a opção FULLSCAN lê todos os campos da tabela para atualizar as estatísticas da tabela.

 

SP_UPDATESTATS 'resample'

 

Atualiza as estatísticas em todas as tabelas do banco de dados,

 

Figura 4 . Atualização das estatísticas.

 

 

 

Figura 5 . Executando a store procedure depois da atualização, com o execution plan ligado.

 

 

Figura 6 . Detalhes do plano de execução.

 

 

Agora com o plano de execução após a atualização vemos claramente os benefícios das estatísticas estarem atualizadas, o custo (CPU Cost) foi para 0%, e o query optimizer que é o responsável por criar os plano de execuções está lendo informações que estão atualizadas, optando assim sempre pelo melhor plano de execução, melhor algoritmo de resolução de query e melhor índice.

 

Até Mais.

 

Dicas para quem está começando:
Veja os próximos eventos
que você não pode perder :

22/11/2008 SQL Launch -
Linhares - ES
Por : devASPNet


22/11/2008 SQL Launch- SQL Server 2008
Rio Paranaiba - Viçosa - MG
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Volta Redonda - RJ
Por : devASPNet


22/11/2008 SQL Launch- SQL Server 2008
Franca - SP
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Canoinhas - SC
Por : devASPNet


22/11/2008 SQL Launch - SQL Server 2008
Tefé - AM
Por : devASPNet


25/11/2008 SQL Launch - SQL Server 2008
Rio de Janeiro - RJ
Por : devASPNet


27/11/2008 SQL Lauch- SQL Server 2008
São Paulo - SP
Por : devASPNet


28/11/2008 SQL Launch - SQL Server 2008
São Paulo - SP
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Pedro Leopoldo - MG
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Petropolis - RJ
Por : devASPNet


29/11/2008 SQL Launch
Floriano - PI
Por : devASPNet


29/11/2008 SQL Launch - SQL Server 2008
Rio de Janeiro - RJ
Por : devASPNet


29/11/2008 SQL Launch - SQL Server 2008
Natal - RN
Por : devASPNet


29/11/2008 SQL Launch- SQL Server 2008
Santa Maria - RS
Por : devASPNet


29/11/2008 SQL Launch
Ituiutaba - MG
Por : devASPNet


5/12/2008 Cloud Computing e o Windows Azure
São Paulo - SP
Por : devASPNet


6/12/2008 SQL Server 2008 Community Launch
São Paulo - SP
Por : devASPNet

Leituras imperdíveis para quem está começando:

º Otimizando a performance no ASP.NET::..
º Criando objetos de paginação personalizados na grid::..
º Uma cesta de compras em ASP.NET::..
º Utilizando o Refresh de parâmetros no .NET::..
º ASP.NET FORMS Authentication::..
º Utilizando propriedades dinâmicas no .NET::..
º Corrigindo problemas de deleção em grid com paginação::..
º Cuidado com os componentes de validação::..
º Otimizando o InitializeComponent::..
º Movendo fonte de aplicações entre máquinas::..
º Agilizando a performance da IDE do VS.NET::..
º Utilizando Short Circuit no VB.NET::..


























  Parceiros:
20% de desconto para os membros do grupo na aquisição de livros e inscrição para eventos

Receba dicas de programação e programação .NET:
E-mail:
Incluir Excluir