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

, , , , ,

Deixe um comentário

Compactando uma página HTML antes de mostrá-la ao usuário

Compactando uma página HTML antes de mostrá-la ao usuário

Eu sempre quiz enviar a página final para o usuário compactada, quis isto para, economizar banda e reduzir tráfego, imagine a situação de uma página ter 512kb acessada por 100 usuários suponhamos a cada 10 minutos isto daria um tráfego enorme para um servidor simples

((512kb/1024)MB*100) a cada 10min

por hora algo em torno de 300MB. Uma forma de fazer isso seria compactar todo o código no servidor nas requisições do usuário, porém, isto gera alguns erros com alguns javascripts, teriamos que ter um código que faça uma compactação seletiva, por exemplo, algum algorítimo que compactasse somente os dados abaixo da tag de fechamento do cabeçalho ou início do corpo da página, mexendo no php.net compreendi como o PHP monta o HTML para o usuário e como ele manuseia o buffer, sendo assim, fácil implementar um compactador usando a função preg_replace, foi o que fiz, veja o resultado abaixo:

ob_start("compactar");
function compactar($b) { 
		$b = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $b); 
		$b = str_replace(array("\r\n", "\r", "\n", "\t", '  ', '    ', '    '), '', $b);
		return $b;
}

ao final da página deve ser colocada a função ob_end_flush();.

Eu tenho usado esta função em alguns casos no início das páginas PHP e em outros casos acima do <body> , notei que alguns javascripts não gostam de serem desidentados. Tem funcionado perfeitamente e reduzido o volume de tráfego no servidor, o que devo fazer agora é remover todo o código javascript que está no index e colocá-lo separado. Quanto ao CSS, este não mostrou problemas algum.

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

Written with StackEdit.

Deixe um comentário

Sistemas de arquivos e sistemas de arquivos

Da necessidade de montar um servidor Squid e um FTP na mesma máquina veio minha curiosidade: Qual o sistema de arquivos mais adequado para este.

Na teoria uma interface SATA II passa até 300MBs então se eu tenho um arquivo de 600MB eu conseguirei transferir este, por exemplo, da minha área de trabalho para o diretório /tmp em 2 segundo, na teoria, pois na realidade nós sabemos que isto não acontece, e isto ocorre por vário motivos, entre eles está a má qualidade do barramento da placa mãe, um Kernel mal projetado (no caso do Windows), um Shell mal projetado enfim, porém, vamos supor que a teoria aqui funcione perfeitamente e precisamos usar ela pra poder fomentar um tabela, precisamos de um ponto base para fazer os comparativos, levando em conta que todos os testes serão feitos na mesma máquina, com o mesmo barramento e com o mesmo disco rígido, os dados recebidos poderão ser analisados e terão veracidade.

Para estes testes estou usando uma arquitetura que imaginei hoje cedo, um P4 com dois HDs, um para o sistema operacional e outro para os testes, assim, não terei problema algum com os processos do Kernel usando os diretórios do sistema.

Imaginei esta arquitetura, pois, este servidor que estou montando irá usar sucata, sim, sucata, restos de computadores que eu fui juntando, como disse acima é um P4, dois discos rígidos SATA II, três placas de rede, fonte ATX 640, MB ASROCK.

Num sistema com RAID0 os dados são quebrados e enviados para os dois discos rígidos, ou seja, um arquivo de 600MB demoraria 1seg para ser transferido de um lugar para outro, num sistema normal demoraria 2seg como já informado acima. Acontece que o RAID tem suas complicações, uma delas me impediu de dar sequência e foi o fato dos meus HDs terem tamanhos diferentes, segundo a literatura para ter um RAID eficiente e sem perdas de performasse e peso é preciso ter HDs idênticos e se possível da mesma marca.

Robersonfox Desktop Ubuntu

Neste sistema que imaginei hoje cedo para meu servidor eu poderia chegar a uma velocidade semelhante a esta, veja bem porque, imagine um cliente do FTP fazendo um download de um arquivo, o SQUID fazendo seu cache e o sistema fazendo seus processos, todos trabalhando no mesmo HD, tudo iria pra a pilha do HD e iria demorar a escrever os dados, levando em conta que este HD tenha um disco e duas cabeças de leitura/gravação, isto causaria um certo estresse no sistema, agora imagine o SQUID num HD e o FTP em outro, o sistema em um terceiro ou juntamente com o SQUID porém em uma partição separada de um tipo diferente, neste casos os arquivos seriam copiados por inteiro e as funções seriam divididas pelos HDs desta forma causando menos estresse ao mesmos, as complicações das transferências são feitas pelo sistema, nós não precisamos nos preocupar com isto. Pois bem, até aqui conseguimos uma forma de aumentar a velocidade de gravação, mas, uma coisa tem que ser salientada, ela foi mencionada poucas vezes neste documento, estou falando do sistema de arquivos, qual seria o melhor sistema de arquivos para o sistema, qual seria o melhor para o server FTP e para o SQUID? Vamos lá, vamos pensar um pouco, o SQUID trabalha com muitos arquivos pequenos, o FTP com arquivos grandes e o sistema não se tem uma ideia certa. Segundo a literatura o EXT4 trabalha muito bem com arquivos de qualquer tamanho, então este fica para o sistema, o ReiserFS trabalha muito bem com arquivos pequenos e o XFS com arquivos grandes, então FTP -> XFS, SQUID -> REISER4, SISTEMA -> EXT4, segundo meus testes o mais rápido de todos foi o XFS seguido pelo JFS e depois o HFS plus movendo um arquivo de 732,80MB, a tabela ficou assim:

1o  XFS moveu 64,655MB/s
2o  JFS  moveu 62,504MB/s
3o  HFS+ moveu 59,562MB/s

A diferença entre o XFS e o HFS+ é enorme, para arquivos grandes. Já para arquivos pequenos a o HFS+ e o JFS ficaram na frente, o JFS ficando em primeiro lugar novamente.

1o JFS 0,003 segundos para mover um arquivo de 16.924 bytes.
2o HFS+ 0,003 segundos para mover um arquivo de 16.924 bytes.
3o XFS 0,048 segundos para mover um arquivo de 16.924 bytes.

Os testes foram feitos 10x, o tempo total de cada um foi somado e dividido por 10 para se ter a ideia do tempo exato que estes gastariam para transferir o arquivo.

Existem boatos de que o XFS tem sérios problemas com perda de dados, inclusive mencionam não usar este sistema de arquivos em computadores pessoais, não encontrei a fonte que diz isto, este sistema de arquivos se mostrou poderoso quando se deve trabalhar com arquivo grandes, é inclusive o único sistema de arquivos do meu conhecer que suporta até 8 exabytes de armazenamento em uma arquitetura 64bits. O JFS é muito seguro e se mostrou muito rápido é particularmente meu favorito e é suportado pela IBM em seus servidores. Já o HFS+ foi decepcionante, tem suas qualidades mas eu acho que nunca as usaria em um servidor como este que estou montando é o sistema de arquivos criado pela Apple Inc. para substituir o antigo HFS. O EXT4 para movimentar arquivos com permissões e tamanhos diferentes continua sendo o melhor. Não fiz o teste com o ReiserFS pois ele é incompatível com meu Kernel e porque não se sabe bem do futuro dele depois do incidente de Hans Reiser.

Related articles

, , , , , ,

1 comentário

Lançado Ubuntu 12.04 (Precise Pangolin)

A nova versão do Ubuntu saiu a alguns minutos, nesta versão vemos significativas melhorias no Unity, uma coisa curiosa é a remoção da função hibernar, segundo o time de desenvolvimento a remoção desta opção é devido a ela não funcionar perfeitamente em alguns hardwares, apesar do informe algumas pessoas dizem ainda conseguir hibernar, outra mudança é a reinclusão do Rhythmbox e remoção do Banshee, particularmente prefiro o Banshee, o mono e os programas que precisam dele sairam também.

Imagem

Para atualizar sua atual instalação você deve, como de costume, passar o comando abaixo em um terminal:

update-manager -d

Este comando abrirá uma janela e nela você deve seguir os passos, está tudo em bom português.

O download pode ser feito pela página do Ubuntu: http://www.ubuntu.com/download ou por Torrent

64 BITS (Computadores novos)

32 BITS (Computadores antigos)

PS.: O site do Ubuntu ficou fora do ar por alguns minutos no momento que foi anunciada a nova versão, aconselha-se fazer o download por meio de torrents por este motivo.

Imagem

, , , , ,

Deixe um comentário

WoW – World Of Warcraft no Linux: Como instalar

Se você deseja rodar o World of Warcraft no Linux, por alguma razão, este post do Melting Pot pode ajudar: ele explica detalhadamente como fazer a instalação.

A partir de uma instalação “zerada” do Ubuntu (segundo o autor, o procedimento serve também para outras instalações), os passos da instalação são detalhados e discutidos.
Estão prometidos mais 2 artigos na mesma série, um sobre configurações e outro sobre resolução de problemas.

Link http://www.mmomeltingpot.com/201[…]raft-under-linux-installation/

,

Deixe um comentário

Competição de código C ofuscado retorna depois de 5 anos

O “International Obfuscated C Code Contest” (IOCCC), Competição Internacional de Código C Ofuscado, retornou e anunciou o início da vigésima competição; a competição estava em hiato, sem resultados publicados para a última competição, que foi realizada em 2006. Agora a competição está de volta e, de 12 de novembro de 2011 até 12 de janeiro de 2012, as inscrições estão abertas para a competição de escrever o mais obscuro ou ofuscado programa em linguagem C que irá ilustrar, perversamente, a importância do estilo de programação, estressar compiladores C com relação a código estranho e demonstrar as sutilezas da linguagem C. Apesar da competição já estar aberta, as submissões online serão aceitas somente a partir de 1o. de dezembro, já que o sistema de submissão está sendo atualizado.

Confira os ganhadores de anos anteriores no site oficial: http://ioccc.org/years.html Regras: http://www.ioccc.org/2011/rules.txt Fonte: http://www.h-online.com/open/news/
Notícias Linux

Posted from WordPress for Android

Deixe um comentário

Selecione um sistema operacional baseado em tipo

image

Deixe um comentário

Lançado o Ubuntu 11.10 Oneiric Ocelot

Foi lançado ontem o Ubuntu 11.10, esta nova versão traz muitas melhorias no desempenho e na parte gráfica, uma das coisas que me agradou muito foi o uso do Linux na versão 3, o aplicativo de transmissão Gwibber foi remodelado e está bastante profissional, Gnome 3, Firefox 7, Libre Office 3, a central de programas ficou parecida com a do Android.

Leia o resto deste post »

, , , , ,

Deixe um comentário

Steve Jobs

Perdemos ontem a definição do termo visionário, um ser simplesmente brilhante, um ser humano maravilhoso que deu a esta geração muitas felicidades, e que apesar de ter um gênio extremamente forte, cativou milhares, não estou falando de Apple, estou falando simplesmente do Sr. Steve Jobs.

Steve jobs

Steve jobs 1955 - 2011

, , ,

Deixe um comentário

Novo Android Market

image

Ontem cedo me apareceram 9 aplicativos para atualizar no meu android, não podia imaginar que entre eles viria uma Nova versão do Market, este, como pode ser visto na imagem ficou muito mais profissional e intuitivo, apto a concorrer contra outros que tem feito muito sucesso por aí , estou falando do concorrente feito pela motorola.

Confira o screenshot e caso ainda esteja usando a versão anterior, não se desespere, em alguns dias seu android também estará rifado esta última versão.

Posted from WordPress for Android

, ,

Deixe um comentário

  • 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