terça-feira, 12 de junho de 2007

Í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


3 comentários:

Fer disse...

Olá,
Foi lançado recentemente um PABX capaz de integrar-se ao SKYPE, permitindo que telefones comuns possam fazer chamadas para contatos SKYPE ou para outros telefones através da rede SKYPE. As chamadas podem ser realizadas, atendidas, colocadas em espera, transferidas de forma extamente igual as da rede de telefonia convencional. O custo é muito baixo e se pega rápido, rápido.
Veja: www.safesoft.com.br/pabx/

Unknown disse...

Gostei. Abordagem simples e objetiva. Uma dica importante, chamando nossa atenção para algo que pode ser determinante no desempenho dos programas.

Unknown disse...

Prezado DAntas.

Sou Diretora de uma consultoria de grande porte e estou buscando profissionais com experiencia em progress para trabalhar no Rio de Janeiro. Voce pode indicar alguem ou me dizer onde posso encontrar esses profissionais?

Meu e-mail e patyfgoncalves@hotmail.com e meu celular 21 92978261

Grata,

Topicos Relacionados