Clipper On Line • Ver Tópico - Browse lento com DBF de mais de 100 mil registros

Browse lento com DBF de mais de 100 mil registros

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

Browse lento com DBF de mais de 100 mil registros

Mensagempor JoséQuintas » 16 Nov 2020 07:42

Só a última:

Usei DBF/CDX até o final do ano passado.
Troquei pra SQL por ser uma evolução relativamente normal, e gostei muito do resultado.
Com certeza ficou tudo mais rápido e mais prático agora.
NÃO tive nenhum problema com DBF/CDX, mais de 100 mil registros era normal, mas com lentidão conforme o filtro.

Também pode pensar nisso, de usar LetToDbf ou SQL, porque quando é só o servidor que mexe nos arquivos, fica tudo mais rápido e seguro.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 15547
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 898 vezes

Browse lento com DBF de mais de 100 mil registros

Mensagempor Itamar M. Lins Jr. » 16 Nov 2020 08:10

Olá!
nsar nisso, de usar LetToDbf ou SQL, porque quando é só o servidor que mexe nos arquivos, fica


Uso LetoDbf, com muito mais que isso. Tudo instantâneo. Qualquer pesquisa, uso arquivos temporários "index for ... temporary"
Não cai nada, não perde conexão, não preciso fica verificando se a conexão está ativa, tudo muito rápido.
Alguns com volume superior a 2 mil NFCe por mês. O contas a receber passa de 100 mil registros, registros de itens na NFe de entrada com mais de 90 mil itens tudo instantâneo usando LETODBF.
********************************
Static Function UpGet(oDlg,oTab)
********************************
*
*
PegaVarEntradas()
AtualizaVarEntradas()

tp54e->(ordSetFocus(1))
tp54e->(OrdScope(0,tp50e->es_numero+tp50e->cod_fornec+dtos(tp50e->es_datarec) ))
tp54e->(OrdScope(1,tp50e->es_numero+tp50e->cod_fornec+dtos(tp50e->es_datarec) ))
tp54e->(DbGoTop())
PegaVarItem()
IF oTab:GetActivePage() = 2
   oTab:oBrPd:Refresh()
EndIf


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4798
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 173 vezes
Mens.Curtidas: 272 vezes

Browse lento com DBF de mais de 100 mil registros

Mensagempor alberto_dias » 16 Nov 2020 09:11

Meus Amigos,
Muito obrigado pelas respostas,
José Quintas,
Itamar,
=========================================================================================================
Que aula, maravilhosa, como a gente aprende muito, com está colaboração de vocês, que possuem um maior conhecimento,
=========================================================================================================
José Quintas,
===========
corri para ver o código do Sistema, que utilizo nos clientes, e achei um monte de índices redundantes.(como você mencionou).
em varias tabelas, nem sei como começar a corrigir.
também sobre evoluir, temos que evoluir, há mito tempo, venho pensando em mudar para SQL, mas vou ser claro,
não sei como começar, por isso volto com outra pergunta,
Você teria um pequeno código, de como acessar uma tabela .dbf, com SQL, incluir um registro, alterar, e excluir,
assim eu poderia testar neste cliente que tenho com mais de 100.000 registros, e ver os efeitos desta mudança,
==========================================================================================================
Itamar,
======
Já tentei o LetoDB, consegui rodar por vários meses, em um cliente,
Gostei de usar, mas tive que parar,
=============================
consegui um ganho de velocidade, verdade, mas tive muitos problemas,
principalmente, quando a quebra de conexão com o Servidor.
e tive uma coisa que eu queria evitar, que era a quebra de índice,
para reindexar, era extremamente rápido,
basicamente, tinha uma configuração do letodb.ini, mas era pouca, faltam informações importantes, documentação, onde checar,
Pergunta,
1) será que usava um LETODB, antigo, você teria um link para eu ver uma versão mais nova, dê repente, uma evolução, poderia voltar a usar,
2) com a minha inexperiência, talvez não soube, como usar corretamente, tem algum exemplo, de como acessar um tabela .dbf, incluir
alterar, e excluir, para eu poder ver onde errei,
3) você mencionou, que não tem como perder conexão, preciso saber como, o LETODB, é muito fácil de implementar em qualquer Sistema,
4) Não sei usar o temporário, em pesquisa, desculpe, você, teria um exemplo, sofro muito com os clientes, justo na hora dos relatórios,
=====================================================================================================================
Se puderem, já agradeço aqui por antecipação,
muito obrigado
Alberto Dias
Alberto Dias
Atual.: Harbour 3.2.0 dev (r1703241902) + Gtwvg E Hmg IDE 3.5
Máquina Notebook - DELL ( INTEL CORE i5 ) 8 GB
Sistema - Windows 10 64 Bits
Avatar de usuário

alberto_dias
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 64
Data de registro: 10 Abr 2005 09:46
Cidade/Estado: Taboão da Serra - SP
Curtiu: 0 vez
Mens.Curtidas: 5 vezes

Browse lento com DBF de mais de 100 mil registros

Mensagempor JoséQuintas » 16 Nov 2020 10:33

alberto_dias escreveu:corri para ver o código do Sistema, que utilizo nos clientes, e achei um monte de índices redundantes.(como você mencionou).
em varias tabelas, nem sei como começar a corrigir.


Se está usando CDX com tags, dá pra usar o nome da tag ao invés de número.
OrdSetFocus( "nometag" ) ao invés de OrdSetFocus( 3 ), confirme de SET ORDER TO ( "nome" ) funciona.

Qual a diferença?
Selecionando por nome, vai poder apagar os inúteis a qualquer momento, porque não vai importar mais se é 1,2,3.

No final... preocupado com aumentar a quantidade de índices, e talvez vai acabar reduzindo... kkkk

Essa mudança pode ser interessante, mesmo que depois altere pra letodb, vai valer lá também, pode até dar uma confirmada antes de começar a mexer, assim já fica preparado pra mudanças futuras.
Ao mesmo tempo que vai estar melhorando o fonte atual, vai estar mais preparado pra depois.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 15547
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 898 vezes

Browse lento com DBF de mais de 100 mil registros

Mensagempor Itamar M. Lins Jr. » 16 Nov 2020 16:54

Olá!
) será que usava um LETODB, antigo, você teria um link para eu ver uma versão mais nova, dê repente, uma evolução, poderia voltar a usar,

Novamente, aviso que não uso o LETODB.
Eu uso o LetoDBbF tem esse F no final, do ELCHS.
https://github.com/elchs/LetoDBf

você mencionou, que não tem como perder conexão, preciso saber como, o LETODB, é muito fácil de implementar em qualquer Sistema,


Não perde, 0% de perda de conexão usando o LetoDbf. Todo erro do sistema eu recebo por email. Só recebo erro falta de energia, mudança de IP(estações) ai não tem como evitar.

Não tem segredo, conectou pela primeira vez a conexão ficará ativa até mudar IP(estação/servidor) ou desligar o servidor.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4798
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 173 vezes
Mens.Curtidas: 272 vezes

Browse lento com DBF de mais de 100 mil registros

Mensagempor Itamar M. Lins Jr. » 16 Nov 2020 17:14

Olá!
Indexar com arquivos temporários.
cQuery := " dtos(vencimento) >= '"+dtos(inicio)+"' .and. dtos(vencimento) <= '"+dtos(fim)+"' .and. empty(pagamento) "
OrdBy  := "cliente + dtos(vencimento) + cod_venda"

re->(ordSetFocus(1))
tRec := re->(OrdKeyCount())
oBar := HProgressBar():NewBox( "Processando, "+lTrim(str(nRec,9))+" De "+lTrim(str(tRec,9))+" Registro(s)",,,350,,tRec)
Index on &OrdBy Tag re100 for &cQuery temporary additive eval {||oBar:Step(),.T.}
oBar:Close()


Com ou sem LETODBF.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4798
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 173 vezes
Mens.Curtidas: 272 vezes

Browse lento com DBF de mais de 100 mil registros

Mensagempor alberto_dias » 17 Nov 2020 05:33

Itamar,
Bom dia,
Desculpe pelo "furo", realmente pensei que o LETODB, fosse o mesmo,
Demorei para responder, pois já corri para programar, para fazer os testes, com o LetoDbf
Baixei os arquivos e estou iniciando os testes do LetoDbf,
Encontrei um problema logo de início, por favor, saberia me dizer se faltou alguma coisa,
============================================================================
Estou tentando compilar o primeiro exemplo, e apesar de ter colocado os arquivos .h e .ch
nos diretórios include, aparece este erro:
==========================================================================================
Nota: eu não sei como colocar o código aqui apresentado, naquela telinha azul bonita, que vocês mostram,
==========================================================================================
17/05/2019 12:52 6.910 test_dbf.prg
17/05/2019 12:52 10.087 test_dbfe.prg
17/05/2019 12:52 6.639 test_file.prg
17/05/2019 12:52 8.925 test_filt.prg
17/05/2019 12:52 12.340 test_mem.prg
16/11/2020 19:37 2.080.259 test_ta.exe
17/05/2019 12:52 5.515 test_ta.prg
17/05/2019 12:52 9.763 test_tr.prg
17/05/2019 12:52 9.840 test_var.prg
36 arquivo(s) 2.277.593 bytes
4 pasta(s) 96.312.471.552 bytes disponíveis

C:\TESTES\LetoDbf\tests>hbmk2 test_dbf
hbmk2: Processando script local: hbmk.hbm
Harbour 3.2.0dev (r2011030937)
Copyright (c) 1999-2020, https://harbour.github.io/
Compiling 'test_dbf.prg'...
Lines 656, Functions/Procedures 1
Generating C source output to 'c:\Temp\hbmk_81pl6w.dir\test_dbf.c'... Done.
c:/hmg.3.5/mingw/bin/../lib/gcc/i686-w64-mingw32/9.3.0/../../../../i686-w64-mingw32/bin/ld.exe: c:/Temp/hbmk_81pl6w.dir/test_dbf.o:test_dbf.c:(.data+0x48): undefined reference to `HB_FUN_LETO_SET'
c:/hmg.3.5/mingw/bin/../lib/gcc/i686-w64-mingw32/9.3.0/../../../../i686-w64-mingw32/bin/ld.exe: c:/Temp/hbmk_81pl6w.dir/test_dbf.o:test_dbf.c:(.data+0x328): undefined reference to `HB_FUN_LETO_DBDRIVER'
collect2.exe: error: ld returned 1 exit status
hbmk2: Erro: Executando linkeditor. 1
gcc.exe c:/Temp/hbmk_81pl6w.dir/test_dbf.o c:/Temp/hbmk_81pl6w.dir/hbmk_lxviiv.o -mwindows -Wl,--start-group -lrddleto -lhbextern -lhbdebug -lhbvmmt -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lwinmm -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -otest_dbf.exe -Lc:/hmg.3.5/HARBOUR/lib/win/mingw -L../lib

hbmk2: Erro: Referenciado, faltando, mas funç⌡es desconhecida(s): LETO_SET(),
LETO_DBDRIVER()

C:\TESTES\LetoDbf\tests>
====================================================================
Muito obrigado, novamente,
========================
Alberto dias
Alberto Dias
Atual.: Harbour 3.2.0 dev (r1703241902) + Gtwvg E Hmg IDE 3.5
Máquina Notebook - DELL ( INTEL CORE i5 ) 8 GB
Sistema - Windows 10 64 Bits
Avatar de usuário

alberto_dias
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 64
Data de registro: 10 Abr 2005 09:46
Cidade/Estado: Taboão da Serra - SP
Curtiu: 0 vez
Mens.Curtidas: 5 vezes

Browse lento com DBF de mais de 100 mil registros

Mensagempor Itamar M. Lins Jr. » 17 Nov 2020 13:03

Olá!
Primeiro gerar a LIB do LetoDBf. Fez isso ?
Leu o readme.txt ?

Gerando o servidor .EXE, eu uso o service.
 2.1 building letodb with hbmk2, for all C compilers

Server itself:
    letodb.hbp is ready configured server for Windows and Linux daemon,
    letodbsvc.hbp is ready configured server for use as Windows service.
    -- Windows service  hbmk2 letodbsvc
    -- all other OS     hbmk2 letodb

Gerando a lib, eu uso: hbmk2 rddleto.hbp
Client library:
    -- all OS:          hbmk2 rddleto
    Recommended is to integrate LetoDbf client library into your Harbour environment as an 'addon':
    -- all OS:          hbmk2 rddletoaddon


Depois dessa etapa, linkar com a nossa aplicação.
After successful build as 'addon', you can compile *at any place* your applications with:
    hbmk2 your_application letodb.hbc
else you have to point to the "letodb.hbc", example out of a sub-directory in LetoDBf:
    hbmk2 your_application ../letodb.hbc


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4798
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 173 vezes
Mens.Curtidas: 272 vezes

Browse lento com DBF de mais de 100 mil registros

Mensagempor alberto_dias » 18 Nov 2020 07:33

Itamar,
Bom dia,
Muito obrigado,
Folga demais de minha parte, querendo tudo na mão !,
Li o Readme.txt
Gerei a lib
Agora compilou,
Mas, deu alguns avisos, chega a compilar, mas quando você tenta, mandar executar, ele não está executando,
============================================================================================
Você pode verificar se estou com mais algum arquivo faltando,
Atenciosamente,
Alberto Dias
Anexos
letodb.jpg
Alberto Dias
Atual.: Harbour 3.2.0 dev (r1703241902) + Gtwvg E Hmg IDE 3.5
Máquina Notebook - DELL ( INTEL CORE i5 ) 8 GB
Sistema - Windows 10 64 Bits
Avatar de usuário

alberto_dias
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 64
Data de registro: 10 Abr 2005 09:46
Cidade/Estado: Taboão da Serra - SP
Curtiu: 0 vez
Mens.Curtidas: 5 vezes

Browse lento com DBF de mais de 100 mil registros

Mensagempor Itamar M. Lins Jr. » 18 Nov 2020 08:10

Olá!
Esse ai não é o SERVIDOR que roda como serviço do windows.
Vc vai precisar colocar ele no iniciar do windows ou executar ele toda vez que ligar o computador.
Então, o erro que está aparecendo é o seguinte: Vc precisa editar o letodb.ini e informar o caminho(path) real o path=c:\minha_base_dbf\ deve existir de fato, senão ele dá erro e não fica como daemon(rodando em segundo plano)
Para ver os erros basta vc editar o arquivo de erro letodbf.log, Por exemplo type letodbf.log ou notepad letobbf.log

O que vc instala ele como serviço do windows é o letodbsvc.hbp que vai gerar o mesmo letodb.exe mas só que vc instala ele definitivo, e toda vez que ligar o computador ele já entra como serviço.

c:\letodbf\bin\letodb.exe install

Parar o letodb na rede:
net stop letodbf_service

remover o serviço(...)
sc delete letodbf_service


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4798
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 173 vezes
Mens.Curtidas: 272 vezes

Browse lento com DBF de mais de 100 mil registros

Mensagempor Itamar M. Lins Jr. » 18 Nov 2020 08:25

Olá!
Desculpe pelo "furo", realmente pensei que o LETODB, fosse o mesmo,

Esse LetoDbf é muito superior ao LETODB.
Tem várias melhorias, roda em duas threads(tasks), muito mais rápido, sem nenhum bug (grave).
  Port = 2812              -    Server port number, default is 2812 [ then 2813 used for second socket ]
                                    There are two! ports used by server, this and the following number.
                                    ! You ever connect to first port number !

Usa compactação de dados na rede, criptografia, transactions...
  7.2 Transaction functions

A transaction is a series of data changes, which is guaranteed to be applied in a sequence alike
'one block'. In practical life, only record/ file locks are set at server ( no DbAppend() lock ),
and all data changes are buffered at client side. If you DbSeek()/ DbSkip() to a record with changed
data, you will see at client your changes still not applied at server side.
When committing the transaction, one single request about all changes is send to server, which will
start processing data changes firstly after complete receiving the request and further pre-checks.
Up to this point is ensured *all or nothing* of a transaction is processed.
If the server experience hardware problems during processing the sequence, like a power loss, parts
of a transaction will miss ...

As a side effect, transactions are nice for Flock()ed or non-shared, exclusive opened tables, because
for these it leads to a !drastical! improved performance to append 10000 records in a fraction of a second.
For RLock() an insane tremendous overhead is needed, if really **many** records need to be
changed. Example: to Rlock() the 1000th record at server, it must search through 999 existing locks.
In sum a compare have been done 499500 times for the 1000th record.
Only 1000 Rlock() record changes of above example are taken just on the fly, but if there are 10th
of thousands ...


Otimizado para uso com servidor LINUX ou até para quem precisa usar SAMBA(SMB) para compartilhar os DBFs com outros programas usando Linux(SAMBA).

Saudações
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4798
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 173 vezes
Mens.Curtidas: 272 vezes

Browse lento com DBF de mais de 100 mil registros

Mensagempor alberto_dias » 18 Nov 2020 15:54

Itamar,
Boa tarde,
Sem palavras,
Funcionando,
Deu certo, bora agora testar e fazer os ajustes,
Consegui compilar até o utilitário console, muito útil para acompanhar o uso,
=================================================================
Muito obrigado,
Atenciosamente,
Alberto Dias
Anexos
console.jpg
Alberto Dias
Atual.: Harbour 3.2.0 dev (r1703241902) + Gtwvg E Hmg IDE 3.5
Máquina Notebook - DELL ( INTEL CORE i5 ) 8 GB
Sistema - Windows 10 64 Bits
Avatar de usuário

alberto_dias
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 64
Data de registro: 10 Abr 2005 09:46
Cidade/Estado: Taboão da Serra - SP
Curtiu: 0 vez
Mens.Curtidas: 5 vezes

Browse lento com DBF de mais de 100 mil registros

Mensagempor Itamar M. Lins Jr. » 19 Nov 2020 07:37

Olá!
Parabéns, pelo seu desempenho.
Pq muitas vezes encontramos perguntas no forum e vemos claramente que a pessoa, está com muita pressa em resolver o problema dele. E passa batido pelo manual da ferramenta.
Mas sendo aqui um forum de consulta também é bom deixar claro o caminho para as outras pessoas percorrerem.
Então é bom ler o que diz o desenvolvedor que criou a LIB/recurso... Pois simplifica muito as coisas.
A maioria das perguntas do LetoDbf está respondida no readme.txt do Elchs.

Espero que o LetoDBf dê conta do recado ai.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 4798
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 173 vezes
Mens.Curtidas: 272 vezes

Anterior



Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Cavalo Marinho e 1 visitante


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro