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