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.