[firebase-br] Out of memory - Muitos registros na tabela

Marcos Weimer marcosweimer em gmail.com
Sex Fev 10 09:14:23 -03 2012


Bom dia

------------------------------------------------
Select em blocos
------------------------------------------------
select first 10000 v.* from vendas_itens v
where v.venda_id not in (select first 10000 vi.venda_id from vendas_itens
vi order by vi.venda_id)
order by v.venda_id

Indexed Reads: 49.788.961
Execute time = 2m 6s 563ms

-----------------------------------------------
Select normal (anterior)
-----------------------------------------------
select * from vendas_itens
order by venda_id

Indexed Reads: 0
Non-Indexed Reads: 80
Execute time = 0ms

Eu acho que selecionar em blocos vai ficar impraticavel.
Fazemos o seguinte calculo:
selects_necessarios = total_registros / qtd_por_select
selects_necessarios = 4.365.973 / 10.000
selects_necessarios = 436,59 = 437

Tempo apenas para os selects:
selects_necessarios * execute_time
437 * 2:06 (126 segundos)
55062 segundos
Oque daria 917 minutos e mais alguns segundos
ou.. 15 horas e pouco

Acredito que em blocos não será uma solução viável, ou meus calculos estão
muito errados


-=Ma®©oS=-
Marcos R. Weimer
Puma GTE 1974 Tubarão
Delphi / C# / ASP.NET / WebServices / Firebird




Em 10 de fevereiro de 2012 08:46, Diego Bulgarelli
<diegobulg em gmail.com>escreveu:

> Bom dia! :)
>
> Não sei se é a melhor solução, mas e se você selecionar de blocos em blocos
> de registros?
> Ex:
> SELECT FIRST 10000  --> Pega os 10000 primeiros registros
> FROM TABELA
> ORDER BY CODIGO;
>
> SELECT FIRST 10000  --> Pega os 10000 primeiros registros, que não
> estiverem dentro dos 10000 já retornados
> FROM TABELA
> *WHERE CODIGO NOT IN (SELECT FIRST 10000 FROM TABELA ORDER BY CODIGO) *
> ORDER BY CODIGO;
>
> SELECT FIRST 10000  --> Pega os 10000 primeiros registros, que não
> estiverem dentro dos 20000 já retornados
> FROM TABELA
> WHERE CODIGO NOT IN (SELECT FIRST *20000* FROM TABELA ORDER BY CODIGO)
> ORDER BY CODIGO;
>
> Espero ter ajudado
> Diego Bulgarelli
>
> Em 10 de fevereiro de 2012 08:36, Marcos Weimer
> <marcosweimer em gmail.com>escreveu:
>
> > Bom dia
> >
> > Estou desenvolvendo uma rotina que transfere os dados de uma tabela
> > especifica de um banco para outro.
> > Faço da seguinte forma.
> > - Monto a query dinamicamente conforme os campos da tabela
> > - rodo o select
> > - conecto no outro banco e vou transferindo os dados
> > ae chega uma hora que ocorre o out of memory
> >
> >
> > Se rodo o select e efetuo o fetchall na query ae ja vai tudo para o
> brejo.
> >
> > A tabela tem as seguintes caracteristicas:
> > - 96 campos (numeric, string, varchar, date)
> > -  4.365.973 registros
> > Isso mesmo.... este é o numero de registros que a query me retorna se
> > executo um recordcount antes do fetchall
> >
> > Se não executo o fetchall o erro tb ocorre mais demoooooora pra chegar
> até
> > o ponto que acaba com a memoria...
> > a cada 8 registros que passo, aloca de 8 a 12K de memoria
> >
> > Para conexão com o banco uso IBO 4.9.12
> >
> > Lembrando que isso aconteceria apenas em uma primeira sincronização,
> depois
> > seria transferido apenas os dados alterados.
> >
> > e ai.. alguma sugestão ? tem como "descarregar" os registros que ja
> > passaram ??? (estou na pagina 2 e descarregar a 1)
> >
> > Mandei email aqui, pq acho que esta mais ligado a banco do que ao
> framework
> > de desenvolvimento.
> >
> > att
> >
> > -=Ma®©oS=-
> > Marcos R. Weimer
> > Puma GTE 1974 Tubarão
> > Delphi / C# / ASP.NET / WebServices / Firebird
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> >
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista