As funções de DbSeek e MsSeek tem basicamente a mesma funcionalidade, diferença que a função MsSeek tem vantagem de não necessitar acessar novamente a base de dados para localizar uma informação já utilizada pela thread (conexão) ativa.

Desta forma, a thread mantém em memória os dados necessários para reposicionar os registros já localizados através do comando DbSeek (no caso o Recno()) de forma que a aplicação pode simplesmente efetuar o posicionamento sem executar novamente a busca.

A diferença entre o DbSeek() e o MsSeek() é notada em aplicações com grande volume de posicionamentos, como relatórios, que necessitam referenciar diversas vezes o mesmo registro durante uma execução.

 Realizamos um teste comparando os dois desempenhos numa repetição de 100.000 vezes.

 

Tempo usando a função DbSeek:  45.17

Tempo usando a função MsSeek:  21.93

 

Teste:

// DbSeekVsMsSeekTest.prw

#INCLUDE "TOTVS.CH"

 

Static nVezes := 100000

// Chama funcao separadamente testando cada cenário

Function TestSeek()

// Faz a preparação de ambientes

RpcSetEnv("T1","D MG 01") // Empresa e Filial

Sleep(5000)

// Teste com DbSeek

TestDbSeek()

// Teste com MsSeek

TestMsSeek()

// Fecha ambiente

RPCClearEnv()

Return

 

Static Function TestDbSeek()

Local nSeconds    := 0 // Segundos que iniciou a

Local nX          := 0 // Contador de Repeticoes

nSeconds := Seconds()

For nX := 1 To nVezes

      DbSelectArea("SA1")

      DbSetOrder(1) // SIX -> A1_FILIAL+A1_COD+A1_LOJA

      DbSeek(XFilial("SA1") + "000001" + "01" )

Next

ConOut("Tempo: " + AllTrim(Str(Seconds() - nSeconds)) )

Return

 

Static Function TestMsSeek()

Local nSeconds    := 0 // Segundos que iniciou a

Local nX          := 0 // Contador de Repeticoes

nSeconds := Seconds()

For nX := 1 To nVezes

      DbSelectArea("SA1")

      DbSetOrder(1) // SIX -> A1_FILIAL+A1_COD+A1_LOJA

      MsSeek(XFilial("SA1") + "000001" + "01" )

Next

ConOut("Tempo: " + AllTrim(Str(Seconds() - nSeconds)) )

Return

 

  • Sem rótulos