Otimizando consultas em um banco de dados MSSQL SERVER 2008


Na era dos bancos de dados NoSQL me deparei aqui na empresa onde trabalho com um velho problema, a otimização de consultas em um banco de dados relacional, e para piorar meu caso, um MSSQL 2008. No MySQL eu sempre fiz paginação usando LIMIT, porém, até pouco tempo atrás eu desconhecia o equivalente para o MSSQL, foi apanhando muito que cheguei ao estado de hoje e neste artigo ensino para quem se interessar boas práticas para otimização de consultas.

Quando enfrentei o problema pela primeira vez logo tentei usar o comando LIMIT do MySQL, porém, o MSSQL reportou um erro, então o jeito era definir uma data para exibição dos registros, imagine a seguinte situação, uma tabela que é consultada por 200 usuários simultâneos, esta tabela tem quase um milhão de registros e o programador anterior não fez nenhuma otimização de consultas, toda vez que um único usuário faz uma requisição na página do sistema o banco de dados percorre todos os quase um milhão de registro e mostra num JQuery todos os dados de uma vez, paginando no lado do cliente, um SELECT * FROM TABELA; eleva quatro processadores Xeon a 30%, isso com um único usuário, imagine a situação que este servidor passa, imagine o sofrimento dele.

Pois então, este é o cenário da batalha. A minha segunda tentativa foi definir para toda pesquisa sem condição uma condição que para o meu caso é muito válida, esta tabela possui um campo data_cadastro e na maioria das vezes o usuário não precisa ver os dados informados além do ano atual, então uma condição between entre a data 01-01-<?= date('Y')?> (01-01-2013) e a data atual: <?= date('m-d-Y') ?>, isso ajudou bastante, pois, reduziu a paginação do JQuery para 50 páginas, mesmo assim isso não desafogou o servidor e seus quatro processadores, as consultas retornavam tantos registros que geravam um arquivo HTML com 9.5MB de peso, até a rede sofria, o gasto médio de memória era de 6GB só para o MSSQL.

Uma nova intervenção foi necessária, o servidor estava negando serviço em muitos casos, então resolvi apelar para o LIMIT, pesquisei na web em busca de um equivalente para o MSSQL e descobri o TOP, analisei por um tempo o tanto de registro que os usuários exigiam e defini um limite 300, ainda assim seis telas na paginação do JQuery, adotei o critério de implementar a instrução TOP somente nas telas onde se faziam muito uso dos dados e ainda mais utilizadas pelos usuários, desta forma consegui desafogar o MSSQL.

O uso conjuto da instrução BETWEEN e da instrução TOP foi suficiente para assegurar um bom desempenho do servidor, mas, ainda assim não foi suficiente, um código mal escrito pode derrubar facilmente um servidor HP dedicado com ISS, PHP 5 e MSSQL 2008, não acreditava nisso até ver acontecer aqui, todas as medidas a nivel de codigo foram tomadas, o melhor a se fazer seria instalar um APACHE e a ultima versão do PHP, pois, esta já suporta as bibliotecas de Garbage Collector, coisa tão necessária e que esperou quase seis versões do PHP para ser implementado (disponível a partir da versão 5.3 do PHP).

A sintaxe para o uso do TOP é a seguinte: select TOP 300 * from tabela;.

Por fim, ainda com as instruções acima, algumas páginas geravam arquivos HTML enormes e que demoravam bastante para serem exibidos para o usuário final, então apliquei a função do artigo anterior e reduzi o tráfego da rede pela metade.
Estas otimizações não levaram nem uma semana para serem implementadas.

Escrito por Roberson Carlos robersonfox at gmail.com 23/09/13

Written with StackEdit.

Anúncios

, , , , ,

  1. Deixe um comentário

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

  • Follow Carl Roberson's on WordPress.com
  • Fallow me
  • Linux 20 Anos
  • Ubuntu LTS Trusty Tahr

    Lançamento da versão LTS do Ubuntu20 de abril de 2014
    Ubuntu LTS Trusty Tahr Chegou!!! http://www.ubuntu.com/download/desktop
  • Grafica Livre

  • O que estou lendo agora

  • Na minha estante me aguardando


    Literatura
  • Bookmark and Share
%d blogueiros gostam disto: