Índices

Pessoal, não sei se todos sabem como funciona o Índice de uma tabela no Banco de Dados Progress e como os Sistemas Client e Server do Progress manipulam isso. Fiz questão de escrever o nome dos três componentes para que vocês comecem a ver que não e uma coisa só.

Basicamente funciona da seguinte maneira:

O banco de dados e o arquivo físico gravado no disco, um arquivo de dados indexados pelos índices definidos pelo criador das tabelas, lembramos que o banco de dados sozinho não e nada.

Temos o SGBD (Sistema Gerenciador do Banco de Dados), esse sim e o foco, ele acessa os dados e tenta otimizar as consultas o Maximo possível.

Temos também o Client que alem de enviar pedidos e receber dados do SGBD também faz alguns filtros e é aqui que esta uma parte dos problemas de desempenho.

Muitas vezes cometemos erros por não entender como o conjunto funciona. Vou explicar como esses três componentes funcionam juntos.

Vamos supor que você faca uma simples consulta na tabela emitente.

FOR EACH emitente WHERE emitente.cgc = ‘00.000.000/0001-00’ NO-LOCK.

DISP emitente.

END.

Algumas observações:

Como sabemos a tabela emitente tem um índice pelo CGC, por isso não e necessário o uso da clausula USE-INDEX, isso acontece porque o compilador otimiza os códigos colocando os índices. Mas atenção o compilador só coloca índices em casos óbvios como esse e nem sempre o compilador escolhe o melhor índice.

Vamos supor que o compilador não tivesse otimizado esse código ou que o programa não tivesse sido compilado o que aconteceria? Simples o SGBD ao receber uma requisição do Cliente analisaria essa consulta e colocaria o índice, mas novamente lembro que ele usa a mesma regra do compilador, ou seja, esta sujeita à falhas.

Vale a pena lembrar que todos os programas funcionam sem ser compilados, mas isso causa graves problemas de desempenho.

Agora vamos supor que a chave seja dupla:

FOR EACH emitente WHERE emitente.cod-rep = 10 AND

emitente.cod-emitente = 5000 NO-LOCK.

DISP emitente.

END.

A tabela emitente possui uma chave (repres) que atenderia esse caso, ou seja, tanto o compilador como o SGBD achariam essa chave e a usariam. Mas e se a consulta estivesse escrita assim:

FOR EACH emitente WHERE emitente.cod-emitente = 5000 AND

emitente.cod-rep = 10 NO-LOCK.

DISP emitente.

END.

Simples o compilador faria a consulta sem usar índice algum, ou talvez pegasse qualquer índice semelhante. Isso apesar de ser uma simples mudança causaria uma diferença de desempenho muito grande.

Quero ressaltar que esses são apenas exemplos e não foram testados, talvez nesse caso especifico não ocorra uma diferença de desempenho tão grande.

E se a consulta fosse feita como abaixo?

FOR EACH emitente WHERE emitente.cgc = ‘00.000.000/0001-00’ AND

emitente.cod-rep = 10 AND

emitente.cod-emitente = 5000 NO-LOCK.

DISP emitente.

END.

Esse e o caso mais interessante. O único índice com o campo CGC e o índice que só tem o CGC. Diante disso tanto o compilador como o SGBD usaria esse índice. E quem faria o restante do filtro? O Client. Aqui entra uma coisa que pouquíssimas pessoas sabem. O SGBD faz apenas um filtro isso os filtros subseqüentes são feitos no Client, ou seja, depende do desempenho da maquina local e não mais do servidor isso causa catástrofes de desempenho.

Explicando mais detalhadamente funcionaria assim:

1. O Client envia a tal consulta para o SGBD.
2. O SGBD retorna uma seleção usando o índice do CGC.
3. O Client com a consulta retornada filtra os registros com cod-rep = 10 e cod-emitente = 5000.
4. O resultado e exibido.

Vocês nunca se perguntaram por que o RPW e mais rápido ou porque rodar direto no servidor torna o programa mais rápido? Simples, todos os filtros que dependem do Client vão ser rodados no Client que esta no servidor que supostamente e a melhor maquina do ambiente.

Existem dezenas de outras formas de melhorar a desempenho de consultas. Nesse texto o objetivo era deixar clara a função de cada um dos componentes do Sistema.

Espero ter ajudado
Abraço pessoal

FDantas

Formado pela FPJ (Faculdade Politecnica de Jundiai), atualmente atuando como analista de sistemas. Trabalha há mais de 10 anos com analise, desenvolvimento e customização de sistemas desenvolvidos em Progress 4GL como Magnus, EMS e HCM. Atua também com desenvolvimento web, utilizando a ferramenta WebSpeed.

Você pode gostar...

Deixe uma resposta

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