Consultor Eletrônico



Kbase 88016: Melhorando o desempenho de consultas via Dataserver Oracle
Autor   Eloi Rene Pscheidt - CAT
Acesso   Público
Publicação   9/6/2018
O OpenEdge busca do servidor do Oracle os registros para serem tratados pelo client, mesmo que eles sejam apenas excluídos ou alterados.
Quanto maior for o custo da comunicação entre o client e o server, maior será o tempo de processamento.
Entram neste custo diversos fatores relacionados ao ambiente de rede, desde físicos até lógicos, como regras de firewall, vlans, etc.

Uma forma de diminuir este custo é colocar o OpenEdge para executar diretamente no servidor do Oracle.
Desta forma já conseguimos ganhos de 90% em rotinas do produto Datasul, comparadas com a mesma execução em servidores diferentes, ambos via RPW.

Outra forma de diminuir o tempo de processamento é aumentar a quantidade de registros que podem ser trafegados cada vez que são buscados pelo client, diminuindo
a quantidade de vezes que este tráfego ocorre. Isso é possível aumentando o tamanho do cache de registros do Dataserver Oracle.
Na rotina citada conseguimos um ganho de 70%, mesmo mantendo o client e o server em servidores distintos.

Vamos a um exemplo simples e bem comum.
Testamos o código a seguir, primeiro com o tamanho padrão do cache, de 8KB:
FOR EACH tab1 NO-LOCK: END.

Configurando o arquivo dataserv.lg para o nível de log PERFORMANCE, conseguimos as seguintes informações:
Number of array fetches 52632
Number of rows fetched 1000000
Number of array rows 19
Number of array columns 8
Number of tables 1
Space for one row 425
Requested cache size 8192
Actual cache size used 8075

O client precisou ir até o banco de dados 52.632 vezes.
o tempo gasto para isso foi de 50 segundos.

Aumentamos o tamanho do cache para 64KB e conseguimos estes resultados:
Number of array fetches 6494
Number of rows fetched 1000000
Number of array rows 154
Number of array columns 8
Number of tables 1
Space for one row 425
Requested cache size 65503
Actual cache size used 65450

A quantidade de vezes que o client precisou ir ao banco de dados baixou de 52.632 para 6.494 vezes.
O tempo gasto para buscar a mesma quantidade de registros baixou de 50 para 16 segundos.

Para configurar o tamanho do cache, inclua o parâmetro qt_cache_size na conexão dos bancos, conforme o exemplo a seguir:
-db shsports -RO -db sports -U sports/sports@orcl -Dsrv qt_cache_size,65535,qt_bytes

Para configurar o nível de log para PERFORMANCE, adicione mais estes parâmetros:
-Dsrv qt_debug,PERFORMANCE

É possível diminuir ainda mais o tempo de processamento dessa mesma quantidade de registros, se o programa filtrar apenas os campos necessários, deixando de trafegar todos os campos da tabela. Alteramos o programa 4GL para buscar apenas os campos C1 e C2:
FOR EACH tab1 FIELDS(c1 c2) NO-LOCK: END.

O e resultado foi esse:
Number of array fetches 2494
Number of rows fetched 1000000
Number of array rows 401
Number of array columns 3
Number of tables 1
Space for one row 163
Requested cache size 65503
Actual cache size used 65363

O número de vezes que o client teve que ir ao banco de dados caiu de 6.494 para 2.494 vezes.
O tempo gasto baixou de 16 para 5 segundos.

Obs.: os ganhos acima citados podem variar de ambiente para ambiente, e de programa para programa. Faça os seus próprios testes para obter indicadores compatíveis com a sua situação.