DevMedia
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Este é um post disponível para assinantes MVP
###
SQL Magazine 91 - Índice

Processamento Paralelo de instruções SQL - Revista SQL Magazine 91

O artigo aborda como utilizar técnicas de programação paralela para executar instruções SQL como INSERT, SELECT, UPDATE e DELETE mais rapidamente no SQL Server. São apresentadas técnicas, testes e comentários sobre o uso de paralelismo em banco

[fechar]

Você não gostou da qualidade deste conteúdo?

(opcional) Você poderia comentar o que não lhe agradou?

Confirmo meu voto negativo

O principal componente de um computador moderno é o microprocessador. Este componente vem recebendo cada vez mais tecnologias inovadoras para atender as demandas de processamento da maioria das aplicações independente de área de especialização, dispositivos ou ambientes. Uma das principais tecnologias que vem sendo aprimorada, junto com o aumento do clock do microprocessador, envolve o emprego de múltiplos núcleos. De fato, a maioria dos fabricantes de microprocessadores atualmente investe mais na capacidade de multiprocessamento através de diversos núcleos (cores) do que no aumento da quantidade de instruções que podem ser executadas a cada ciclo do microprocessador. Este investimento é observado nos microprocessadores equipados tanto em computadores desktop e servidores como em dispositivos móveis (smartphones e tablets) que já estão recebendo microprocessadores com múltiplos núcleos.

Contudo, infelizmente o desenvolvimento atual de software não consegue acompanhar o crescimento tecnológico proporcionado pelas arquiteturas de múltiplos núcleos. Isso implica que em quase todas as aplicações o uso do microprocessador é subutilizado, pois os desenvolvedores não utilizam as técnicas corretas para obter o máximo desempenho do microprocessador. Uma das maneiras de se explorar a maior utilização dos microprocessadores de múltiplos núcleos é o emprego de técnicas de programação paralela. Com base neste contexto, este artigo apresentará como é possível aplicar algumas das técnicas de processamento paralelo junto com banco de dados, uma área que, infelizmente, possui poucos recursos para a exploração de tais técnicas.

Neste contexto, este artigo apresentará como obter ganhos de desempenho significativos quando se utiliza técnicas de paralelismo em instruções SQL como SELECT, INSERT, UPDATE e DELETE através de diversos testes e análises dos tempos de execução. O artigo abordará aspectos da programação de instruções paralelas no SQL Server e pode ser utilizado como base para implementar as ideias aqui apresentadas em outros contextos, instruções, bancos de dados e conjunto de operações.

Processamento paralelo

O processamento paralelo geralmente é visto como uma área à parte da programação e que, infelizmente, não é ensinada e disseminada entre a maioria dos desenvolvedores. Apesar da sua extrema importância não apenas para aplicações científicas de alto desempenho, identificadas pela sigla HPC (High Performance Computing) – veja a Nota DevMan 1, são raros os exemplos de aplicações comerciais onde é possível encontrar soluções que exploram técnicas de processamento paralelo para otimização e ganho de desempenho.

 Neste ponto é importante destacar que o processamento paralelo deve ser diferenciado do processamento distribuído, pois a primeira área se preocupa exclusivamente com otimização do tempo de execução enquanto a segunda área foca em questões como balanceamento de carga, disponibilidade, otimização de recursos (tempo de execução, memória, acesso a disco), escalabilidade, segurança e outros aspectos.

No contexto de banco de dados é raro encontrar o uso adequado de algumas das principais técnicas de processamento paralelo. Um dos motivos para esta ausência está ligado às origens da área: o armazenamento e o gerenciamento de dados e não a execução de grandes quantidades de operações que se beneficiariam de um processamento otimizado. Contudo, cada vez mais os bancos de dados são responsáveis por realizar muitas operações nos dados, principalmente devido à execução simultânea de múltiplas instruções SQL realizadas por diversos usuários diferentes. A propósito, um dos principais testes de desempenho de bancos de dados, popularmente conhecido como TPC (Transaction Processing Performance Council – Nota DevMan 2), foca na capacidade dos bancos de dados em executar transações de forma concorrente e não em métricas específicas para a medição de capacidade de processamento, como Flops (veja a Nota DevMan 3).

 A maioria dos SGBDR (Sistemas Gerenciadores de Bancos de Dados Relacionais) possui o suporte à execução de instruções SQL implementado através de um otimizador de consultas. Este componente, também chamado de motor ou engine, recebe a instrução SQL enviada pela aplicação ou usuário e através de várias técnicas gera um plano de execução otimizado que processará a instrução utilizando todos os recursos disponíveis para que ela seja executada mais rapidamente e com o menor consumo de recursos. De fato, o otimizador de consultas emprega algumas técnicas de processamento paralelo de forma automática e transparente. Cabe ao DBA ou programador apenas realizar ações de forma indireta visando melhorar o plano de execução que o otimizador pode gerar através de técnicas de tuning como, por exemplo, organizar os dados, criar índices, montar a instrução de forma adequada e outras técnicas. Contudo, como veremos no decorrer deste artigo, nem sempre o plano de execução fornecido pelo otimizador de consultas gera ganhos de desempenho melhores do que a implementação de técnicas de processamento paralelo.

Esta abordagem onde o otimizador de consultas é responsável por realizar o paralelismo retira das mãos do programador a possibilidade de implementar por si próprio o algoritmo e outras técnicas de paralelismo. É devido a esta característica que a maioria das aplicações que exploram fortemente as técnicas de paralelismo descritas a seguir geralmente são implementadas direto na linguagem de programação em linguagens com o C/C++, Java, Fortran, Pascal, etc.

Sendo assim, o ideal seria poder aliar as técnicas de otimização fornecidas pelo otimizador de consultas com a possibilidade de programação paralela para conseguir obter o melhor uso dos recursos do microprocessador. E é exatamente este ponto que este artigo aborda: como utilizar técnicas de processamento paralelo junto com instruções SQL para reduzir o tempo de execução destas instruções. Porém antes é preciso conhecer algumas das técnicas básicas de programação paralela que são descritas na próxima seção.

Técnicas de processamento paralelo

Existem diversas técnicas de processamento paralelo que vem sendo desenvolvidas desde a época da criação dos primeiros computadores na década de 1950. Para simplificar, neste artigo abordaremos apenas duas técnicas que serão úteis para os testes realizados com instruções SQL sequenciais e paralelas: a independência de instruções e a divisão de domínio. Recomendo ao leitor que deseje se aprofundar neste assunto que procure uma das referências fornecidas na seção final deste artigo.

A independência de instruções é um dos principais pontos iniciais que deve ser entendido quando se aborda o assunto de processamento paralelo. A ideia é simples: ao invés de termos apenas um fluxo de execução de instruções que realiza operações nos dados teremos diversos fluxos de execução paralelos. Porém estes fluxos de execução em paralelo NÃO devem executar o mesmo conjunto de instruções, pois caso fizessem isso teríamos apenas a duplicação do que foi feito. Ou seja, é preciso indicar que cada fluxo de execução paralela deve, de alguma forma, executar instruções independentes e diferentes das demais.

Apenas um detalhe de nomenclatura: geralmente utiliza-se o termo threads para indicar fluxos de execução simultâneos e paralelos quando se está programando. Contudo, em banco de dados não possuímos recursos para a manipulação direta de threads, porém possuíamos algo muito poderoso: a capacidade de realizar múltiplas conexões simultâneas no banco de dados. Como será visto mais adiante no artigo, esta será a técnica que utilizaremos para implementar o processamento paralelo dentro do banco de dados.

Voltando para as instruções nos fluxos de execução simultâneos, é importante que cada fluxo faça o seu trabalho de certa forma independente dos demais. Esta independência é um dos pontos centrais do processamento paralelo: saber dividir um problema grande em pequenas partes que podem ser executadas separadamente. Por exemplo: vamos supor que devemos realizar a seguinte soma: 3+2+7+8. Poderíamos realizar esta soma iniciando com 3 + 2 e depois somar este resultado a 7 para então somar este segundo resultado ao número 8 e obter a soma final. Desta forma fizemos um processamento sequencial (também chamado de serial). Agora se aplicarmos parênteses da seguinte maneira: (3+2)+(7+8) fica mais fácil observar que podemos realizar a soma (3+2) de forma independente de (7+8) desde que façamos a soma dos resultados dos parênteses para obter o valor final. Este exemplo mostra, a grosso modo, que apenas quando temos operações que podem ser executadas de forma independente é possível explorar o paralelismo.

"

A exibição deste artigo foi interrompida

Este post está disponível para assinantes MVP.



Mauro Pichiliani é bacharel em Ciência da Computação, Mestre e doutorando em computação pelo ITA (Instituto Tecnológico de Aeronáutica). Trabalha há mais de 10 anos utilizando diversos bancos de dados e ferramentas de programação. [...]

O que você achou deste post?
Serviços

Mais posts