[firebase-br] RES: RES: RES: RES: RES: Dúvida com TIB_Query x TIBODataset (Performance)

José Otávio Lussari tavinhol em gmail.com
Ter Jan 25 16:18:33 -03 2011


Ok Eduardo, obrigado pela explicação : )
Agora, vamos la: Vc disse que o IB_Query tem uma aba transaction! Vc quis
dizer o IB_Connection, não foi?
Eu criei uma função que efetua esse count e retorna o numero de registros da
SQL "Count"...

function Conta_Registro(SQL_Count: String): Integer;
var Contar: TIB_Query;
begin
   Contar:= nil;
   Contar:= TIB_Query.Create(Contar);
   Contar.IB_Connection:= DMGeral.IB_Connection;

   with Contar do begin
      Close;
      SQL.Clear;
      SQL.Add(SQL_Count);
      Open;
   end;

   Result:= Contar.fieldByName('COUNT').AsInteger;
   If Assigned(Contar) then FreeAndNil(Contar);
end;

Até então, eu não estava colocando um TIB_Transaction como vc vê no codigo
acima!
Seguindo a lógica acima, como eu trabalharia com transação nesse código?
eu iria "startar" ela em qual momento? Transação Read Only tem que ser
finalizada com COMMIT, ROLLBACK?

Veja que eu tbem tenho uma função para criar transações:

function TDMGeral.CriarTransacao(Owner: TComponent): TIB_Transaction;
var
   ib_Transacao: TIB_Transaction;
begin
   ib_Transacao:= TIB_Transaction.Create(Owner);
   ib_Transacao.IB_Connection:= IB_Connection;
   Result:= ib_Transacao;
end;

Desculpe a chuva de perguntas amigo, mas vc tocou em um ponto fraco meu
"ainda"... Transações...

atenciosamente,

[ ]’s
José Otávio Lussari
Analista de Sistemas
Bacharel em Sistemas de Informação


-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Eduardo Jedliczka
Enviada em: terça-feira, 25 de janeiro de 2011 16:02
Para: FireBase
Assunto: Re: [firebase-br] RES: RES: RES: RES: Dúvida com TIB_Query x
TIBODataset (Performance)

Transações... kkk... agora você fez uma boa pergunta.

Quando falamos de qualquer componente de acesso, sempre há duas formas
de se trabalhar com transações: explicitas ou implicitas.

As implicitas geralmente são (ou deveriam ser) controladas
automaticamente pelos componentes de acesso. O problema é que a
maioria dos componentes, abre uma transação ad-eternum (ou seja, só
fecha quando termina o aplicativo) e isto gera vários problemas de
performance.

As explicitas são controladas pelo próprio desenvolvedor.

Isto também vale para o IBO, só que ele tem alguns recursos extras,
por exemplo, se você não setar um transaction para uma query, o IBO
irá criar uma nova transação especialmente para aquela query (veja que
o IB_QUERY tem uma aba transaction).

Assim, pode-se desenvolver um sistema grande usando quase que
totalmente transações automáticas. A excessão fica para aquelas
operações que realmente exigem um controle, como por exemplo uma
tranferência de carteira, o lançamento contábil que não seja da 1ª
forma, uma baixa de múltiplas duplicatas, etc.

Mas é preciso alterar (via código) algumas propriedades, para que as
transações automáticas realmente sejam fechadas (este código já foi
postado várias vezes aqui na lista).

Quanto ao isolation, também depende muito da rotina. Mas geralmente
(telas de cadastros simples, por exemplo) eu uso auto-commit,
read-commited, wait transaction.

lembre-se diferente de outros bancos, no firebird, um SELECT EXIGE uma
transação ativa.

==========================
Eduardo Jedliczka
Apucarana - Pr
==========================




Em 25 de janeiro de 2011 14:52, José Otávio Lussari
<tavinhol em gmail.com> escreveu:
> Ok Eduardo, mas me fale uma coisa por gentileza: Vc diz estar em uma
> transação separada da transação da query em questão!
> Entao eu teria um outro TIB_Transaction ligado nessa query com a opção
> ReadOnly marcada, é isso?
> e em Isolation, o que eu deixaria marcado?
> Vc colocou uma outra duvida pra mim: Uma IB_Query que eu uso apenas para
> Select's precisa ter um TIB_Transaction?
> Desculpe amigo, como eu disse sou novato em IBO...
>
> atenciosamente,
>
> [ ]’s
> José Otávio Lussari
> Analista de Sistemas
> Bacharel em Sistemas de Informação
>
>
> -----Mensagem original-----
> De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br]
Em
> nome de Eduardo Jedliczka
> Enviada em: terça-feira, 25 de janeiro de 2011 14:36
> Para: FireBase
> Assunto: Re: [firebase-br] RES: RES: RES: Dúvida com TIB_Query x
TIBODataset
> (Performance)
>
> Sem sombra de dúvidas, esta proposição é muito melhor do que o
> FetchAll, mas há um grande inconveniente:
>
> - São duas operações de busca no banco de dados. E isto pode gerar um
> pequeno overheat no banco de dados (se a tabela for grande ou se o
> select tiver muitos joins);
>
> Para isto, seria interessante que a Query que traz o count estivesse
> numa transação separada (read-only) e pudesse ser executa após o OPEN
> do grid.
>
> Se você ainda deseja exibir numeros reais e absolutos, este método
> parece ser melhor, mas se você contenta-se em mostrar um "tem mais do
> que X", a solução apresentada pelo magno também é boa.
>
> abraço,
>
> ==========================
> Eduardo Jedliczka
> Apucarana - Pr
> ==========================
>
> Em 25 de janeiro de 2011 11:11, José Otávio Lussari
> <tavinhol em gmail.com> escreveu:
>> Certo Eduardo! Entendi perfeitamente sua lógica!
>> Mas vc acha que ao montar uma SQL de consulta conforme os critérios do
>> usuário, eu montar juntamente uma SQL "Count", eu estaria perfendo
>> performance?
>> Pois um SELECT COUNT me retorna apenas um numero! Vc não acha que seria
> mais
>> vantajoso fazer algo do tipo:
>>
>> var x: Integer;
>>
>> SQL_Usuario: SELECT CAMPO1, CAMPO2 FROM TABELA WHERE CAMPO2 LIKE
>> 'Parafuso%';
>>
>> SQL_Count: SELECT COUNT(*) FROM TABELA WHERE CAMPO2 LIKE 'Parafuso%';
>>
>> x:= SQL_Count;
>>
>> if x >300 then
>>  label.caption := 'retornou mais de 300 registros'
>> else
>>  label.caption := inttostr(x) + ' registros';
>>
>> O você acha?
>>
>> atenciosamente,
>>
>> [ ]’s
>> José Otávio Lussari
>> Analista de Sistemas
>> Bacharel em Sistemas de Informação
>>
>> -----Mensagem original-----
>> De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br]
> Em
>> nome de Eduardo Jedliczka
>> Enviada em: terça-feira, 25 de janeiro de 2011 11:00
>> Para: FireBase
>> Assunto: Re: [firebase-br] RES: RES: Dúvida com TIB_Query x TIBODataset
>> (Performance)
>>
>> Na época eu não usava o IBO, então usava o RowNum mesmo.
>>
>> Mas dá para fazer (logo após o open da procura) uma espécie (ok, eu
>> sei que há uma função específica para isto, mas faz algum tempo que
>> nem tenho windows na minha máquina, quem dirá delphi).
>>
>> x := 0;
>>
>> while (x <= 300) and not qy.eof() do
>>  begin
>>    qy.next;
>>    inc(x);
>>  end;
>>
>> if x >300 then
>>  label.caption := 'retornou mais de 300 registros'
>> else
>>  label.caption := inttostr(x) + ' registros';
>>
>> ==========================
>> Eduardo Jedliczka
>> Apucarana - Pr
>> ==========================
>>
>> Em 25 de janeiro de 2011 08:52, José Otávio Lussari
>> <tavinhol em gmail.com> escreveu:
>>> Gostei dessa sua idéia... mas pra vc saber que tinha mais do 300 fotos,
> vc
>>> implementou oq?
>>> Já pensei em colocar em minhas telas de consultas um Select first 300...
>> mas
>>> fazendo assim, ele nunca irá trazer mais do que 300 e não saberei se os
>>> parâmetros que o usuário passou realmente retornaria mais de 300...
> certo?
>>>
>>> Penso nesses detalhes pelo seguinte: Desenvolvi um projeto de memória de
>>> calculo aqui na empresa e quando liberei o sistema para produção, eu
>>> acompanhei o usuário por um determinado tempo. Minhas telas de consultas
>> era
>>> liberadas, não tinha bloqueio! Eu deixei as opções de consultar por
> alguns
>>> campos chaves e com as opções: Iniciados com, que contenham e Seja
igual.
>>>
>>> Certo dia voltei acompanhar o usuário para explicar uma nova atualização
> e
>>> para minha surpresa ele estava fazendo o seguinte: Escolheu um campo que
>>> tinha em comum com todos os produtos e digitava uma letra em comum com
>> todos
>>> os registros, que no caso era o "W", ou seja, ele sempre trazia todos os
>>> registros da tabela e depois ficava procurando um a um na Grid... não me
>>> pergunte porque ele fazia isso, pois jamais eu entenderei isso... rsrsrs
>>>
>>> Agora, estou com outro projeto em IBX e como ele vai crescer, comecei
>> migrar
>>> para IBO. Como eu sei que vai acontecer isso novamente, quero encontrar
>>> alguma forma de obrigar o usuário filtrar mais as consultas... nesse
>> projeto
>>> que mencionei acima, eu coloquei vários bloqueios nas consultas, entre
>> elas
>>> um intervalo de no Maximo 3 meses entre datas e trazer apenas os 30
>>> primeiros registros... fechei mesmo!!!
>>> Agora nesse projeto que estou migrando, estou estuando a melhor forma
>>> possível de lidar com isso e por isso que estou recorrendo a vocês..
>>> entendeu?
>>> obrigado pelas dicas amigo!
>>>
>>> atenciosamente,
>>>
>>> [ ]’s
>>> José Otávio Lussari
>>> Analista de Sistemas
>>> Bacharel em Sistemas de Informação
>>>

______________________________________________
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