SQL com visão de coboleiro

Olá pessoal, tudo bem?

É até meio estranho este título, mas trabalhei em um projeto onde documentava e especificava os processos para COBOL, e assim, pude ver que posso usar algumas formas de como a especificação para COBOL é feita para uso no PL/SQL.

Antes de descrever tais formas, vamos conhecer um pouco do COBOL com esse simples exemplo de instrução SQL especificada abaixo, convertendo-a para arquivos sequenciais, que é a forma que o COBOL trabalha.

Instrução SQL:

select lg.descr_logradouro
, br.descr_bairro
, ci.descr_cidade
, es.descr_estado
, pa.descr_pais
from pais pa
, estado es
, cidade ci
, bairro ba
, logradouro lg
where pa.id_pais = es.id_pais
and es.id_estado = ci.id_estado
and ci.id_cidade = br.id_cidade
and br.id_bairro = lg.id_bairro;

Para especificar esta simples instrução SQL para COBOL, teremos que construir manualmente o que o banco de dados faz sozinho. Umas das vantagens do SQL sobre o COBOL é esta, a forma simples de contruir as instruções e não se preocupar com que o banco irá fazer, porém, devemos sim observar tais formas de como escrever a instrução SQL, pois da maneira correta, o banco pode nos oferecer uma melhor performance na execução.

Especificando em COBOL:

Quero lembrar, para os que não sabem, o COBOL trabalha com arquivos textos sequenciais, mesmo que a informação esteja armazenada em um banco de dados, é necessário a extração destes dados para pode trabalhar.

Abaixo um fluxograma bem comum para um programador COBOL:
Fluxograma

Compreendendo o fluxograma e obtendo informações importantes para o SQL.

No fluxograma acima, os cículos representam os arquivos textos, e aqueles que iniciam com “BD”, representa as tabelas, sendo: BD01 = PAIS, BD02 = ESTADO, BD03 = CIDADE, BD04 = BAIRRO e BD05 = LOGRADOURO, conforme a instrução SQL citada acima. Os quadrados representam programas em COBOL.

Note que para obter o resultado da instrução SQL citada acima, em COBOL, é necessário ter 9 programas. Portanto, é mais complicado trabalhar em COBOL, mas mesmo assim, se tornam rápidos os processos.

Entendendo programa a programa COBOL:

Nome: P100 – Finalidade: Ordenar o arquivo BD01 pela chave que neste caso é a coluna ID_PAIS e grava a saída no arquivo A100.
Nome: P200 – Finalidade: Ordenar o arquivo BD02 pela chave que neste caso é a coluna ID_PAIS e grava a saída no arquivo A200.
Nome: P300 – Finalidade: Faz o JOIN entre os arquivos de saída A100 e A200, grava no arquivo de saída A300 as colunas DESCR_PAIS do arquivo A100, DESCR_ESTADO e ID_ESTADO do arquivo A200, ordena o arquivo de saída A300 pela chave do próximo arquivo que irá fazer o JOIN com este, que neste caso é a coluna ID_ESTADO.
Nome: P400 – Finalidade: Ordenar o arquivo BD03 pela chave que neste caso é a coluna ID_ESTADO e grava a saída no arquivo A400.
Nome: P500 – Finalidade: Faz o JOIN entre os arquivos de saída A300 e A400, grava no arquivo de saída A500 as colunas DESCR_PAIS, DESCR_ESTADO do arquivo A300, DESCR_CIDADE e ID_CIDADE do arquivo A400, ordena o arquivo de saída A500 pela chave do próximo arquivo que irá fazer o JOIN com este, que neste caso é a coluna ID_CIDADE.
Nome: P600 – Finalidade: Ordenar o arquivo BD04 pela chave que neste caso é a coluna ID_CIDADE e grava a saída no arquivo A600.
Nome: P700 – Finalidade: Faz o JOIN entre os arquivos de saída A500 e A600, grava no arquivo de saída A700 as colunas DESCR_PAIS, DESCR_ESTADO, DESCR_CIDADE do arquivo A500, DESCR_BAIRRO e ID_BAIRRO do arquivo A600, ordena o arquivo de saída A700 pela chave do próximo arquivo que irá fazer o JOIN com este, que neste caso é a coluna ID_BAIRRO.
Nome: P800 – Finalidade: Ordenar o arquivo BD05 pela chave que neste caso é a coluna ID_BAIRRO e grava a saída no arquivo A800.
Nome: P900 – Finalidade: Faz o JOIN entre os arquivos de saída A700 e A800, grava no arquivo de saída A900 as colunas DESCR_PAIS, DESCR_ESTADO, DESCR_CIDADE, DESCR_BAIRRO do arquivo A700, DESCR_LOGRADOURO do arquivo A800.

Os JOINs entre os arquivos são feitos pela colunas que são PK nas tabelas, mas porque a ordenação nos arquivos? No COBOL, o modo de fazer o JOIN entre dois arquivos, só é possível se as chaves estiverem ordenadas iguais, ou seja, o COBOL lê o arquivo texto somente uma única vez e compara a coluna especificada que é chave entre os dois arquivos, a saber, num arquivo de configuração onde são especificados os tamanhos e tipo de dados, como se fosse a estrutura da tabela no banco.

Repare que as colunas que são necessárias no resultado final, e como está em outro arquivo(tabela), após recuperar esta coluna, ela vem sendo transportada de arquivo para arquivo até sair no arquivo final. Exemplo: Coluna DESCR_PAIS, ela está nos arquivos A100, A300, A500, A700 e no arquivo final A900.

Conclusões:

O banco de dados faz todo esse processo que está desenhado para COBOL, mas sem que o usuário veja, mas é importante, como disse entender essa estrutura, que lembra o plano de execução do SQL.

Baseado nessa afirmação, vou citar algumas considerações:

  • Importância da ordem das tabelas na cláussula FROM: Se o banco de dados prepara a mesma estrutura de planejamento do COBOL, podemos afimar que é importante informar nesta cláussula, as tabelas maiores primeiramente, ou seja, “FROM tabela grande, tabela média, tabela pequena”. Para quem não sabe, o banco de dados lê as tabelas na ordem inversa, “tabela pequena, tabela média, tabela grande”.
  • As colunas na cláussula WHERE: Informar na mesma ordem das tabelas, considerando que, se houver condições que não seja JOIN, colocá-las abaixo do JOIN da tabela em questão. Neste caso, estamos utilizando PKs que contém apenas uma única coluna, mas no caso onde têm várias colunas, informar nesta cláussula, na mesma ordem das colunas da PK, sempre lembrando que o banco lê a instrução de modo inverso, ou seja, de trás para frente ou de baixo para cima.
  • No caso de condição, por exemplo, recuperar todos os endereços do estado de São Paulo, informar assim: ‘SP’ = tabela.coluna, pois se nesta coluna haver índice, o banco irá fazer esta condição utilizando o índice.
  • Na cláussula ORDER BY: Informar na cláussula SELECT a mesma ordem desta cláussula, ORDER BY.
  • Quando usar condições que envolvem campos do tipo DATE, usar o mesmo formato que está parametrizado no banco de dados, na maioria dos casos, ‘DD-MON-YYYY’.
  • Lembre-se, USEM comentários necessários dentro de seu código, alinhe a estrutura de seu código, IF com END IF, LOOP com END LOOP, se escrever em minúscula, siga sempre escrevendo assim, para o banco, ele diferencia, posições de colunas e tabelas no select, entre outros. Isso é importante, pois toda vez que executar uma instrução SQL, o banco de dados monta um plano de execução, e se você sempre usa as mesmas regras, vai ser mais rápido o retorno.

Espero que tenho esclarecido a forma de como banco de dados trabalha, e comparando ao COBOL, esse é o motivo do COBOL processar mais rápido, pois é sempre assim, não se pode mudar tais regras.

Abraços,

Você pode gostar...

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *