No post anterior apresentei algumas considerações sobre o arcabouço teórico que existe por trás da teoria de processamento de uma consulta em um banco de dados.
No texto percebemos que uma determinada consulta será transformada em uma expressão algébrica/relacional.
SELECT nome FROM tbCliente WHERE tipo = 1
pode gerar duas expressões distintas:
π nome ( σ tipo = 1 (tbClientes) ) [1]
ou
σ tipo = 1 ( π nome (tbClientes) ) [2]
O texto termina com a seguinte questão: Qual delas é mais apropriada?
Para responder esta questão vamos partir do seguinte contexto:
- Estamos trabalhando localmente em uma máquina qualquer.
- O Sistema Operacional (SO) gerencia a memória da máquina da maneira dinâmica.
- A memória RAM está configurada da seguinte forma: 4 processos foram alocados na memória, uma partição de 2 kbytes está disponível para um quinto processo (vide figura).
- A consulta acima foi disparada, um quinto processo foi criado.
- Cada registro da tabela tbClientes ocupa um espaço em disco de 182 bytes.
- A tabela possui 15 registros, o espaço de armazenamento de mesma caracteriza-se em 2730 bytes.
- O campo nome ocupa 40 bytes, e o campo tipo ocupa 1 byte.
- Assuma que existe 3 clientes classificados com tipo 2 na tabela.
- Neste caso temos 12 clientes com tipo 1, totalizando 2184 bytes para os mesmos.
Respondendo a questão.
Para a expressão algébrica 1: Ao selecionarmos os clientes do tipo 1 não teremos espaço para alocá-los, diretamente, na memória visto que os 2184 bytes superam os 2048 da partição livre (vide figura) – pois selecionamos 12 registros com 182 bytes – Para alocar as informações o SO teria que partir para um swapp ou aplicar as técnicas de paginação ou segmentação, fato esse que degrada o desempenho geral da aplicação.
Para a expressão algébrica 2: Ao projetarmos o nome dos 12 clientes, criamos um conjunto de 480 bytes (12 * 40). Temos também que alocar o campo tipo na memória, neste caso o tamanho do conjunto salta para 492 bytes. A partição livre, de 2048, acondiciona tranquilamente o processo, o SO não terá que realizar swapp ou aplicar as técnicas de paginação ou segmentação.
Concluindo.
O contexto aplicado para responder a questão caracteriza-se pela simplicidade, porém ele pode se generalizado. E se fosse necessário realizar uma consulta com dados de duas tabelas? Sendo que uma delas encontra-se armazenada em um servidor remoto, distante geograficamente da estação de processamento da consulta.
Neste exemplo, a responsabilidade pelo desempenho do processo ficou com o sistema de gerenciamento de banco de dados, mas se você disparar em sua aplicação a consulta:
SELECT * FROM tbCliente WHERE tipo = 1
e utilizar somente o campo nome, ai meu caro …
Pense nisso…
Enfim, Banco de dados é a sistematização teórica de Sistema Operacional e de Estrutura de Dados.
Abraços
J. A. Fabri