Autor Tópico: Melhoria na performance com Firebird e Postgresql  (Lida 2104 vezes)

Alexandre Pereira Bühler

  • Expert
  • *****
  • Mensagens: 1659
  • Nunca estabeleça um teto para os seus rendimentos.
    • Simão & Bühler Ltda
    • Email
Melhoria na performance com Firebird e Postgresql
« Online: Julho 14, 2014, 02:56:33 pm »
Bom dia,
Tenho bases com tabelas acima  de 1GB com mais de 11.000.000 de registros e fica super lento mostrar a tela.

O Firebird e o Postgresql trabalham com MVCC.
Isto quer dizer que um SELECT COUNT(*) FROM tbl; fica muito lento para tabelas acima de 1GB.
E como se a Netmake desse prioridade para o mysql e esquecesse de ver como os outros SGDB funcionam.
Vide:
https://wiki.postgresql.org/wiki/Slow_Counting
http://www.firebirdfaq.org/faq5/

Isto implica que se um cliente muito doido, e sempre existe um, quiser fazer um "select * from tbl; " ou uma query trouxer uma quantidade muito grande de registros o scriptcase terá o retorno da query super rápido como no mysql. Mas para montar a paginação irá demorar mais de 18 segundos. Pois o scriptcase usa select count(*) from tbl; para montar a paginação. Consequentemente a grid ou form irá demorar muito para aparecer na tela.

Então como manter o suporte ou mesmo vender uma aplicação que você sabe que será lenta com o passar dos anos e não poderá fazer nada para mudar isto? Pois o framework é fechado. mas há várias maneiras de contornar isto se vocês quiserem.

Nos fontes gerados de uma grid, por exemplo, a função pode ser achado no:
arquivo nome_grid_total.class.php
function quebra_geral()

Exemplo de função quebra_geral gerada pelo scriptcase:

 function quebra_geral()
   {
      global $nada, $nm_lang ;
      if ($_SESSION['sc_session'][$this->Ini->sc_page]['grid_xxxxxx_xxxxxx']['contr_total_geral'] == "OK")
      {
          return;
      }
      $_SESSION['sc_session'][$this->Ini->sc_page]['grid_xxxxxx_xxxxxx']['tot_geral'] = array() ;
      $nm_comando = "select count(*) from " . $this->Ini->nm_tabela . " " . $_SESSION['sc_session'][$this->Ini->sc_page]['grid_xxxxx_xxxxxx']['where_pesq'];
      $_SESSION['scriptcase']['sc_sql_ult_comando'] = $nm_comando;
      $_SESSION['scriptcase']['sc_sql_ult_conexao'] = '';
      if (!$rt = $this->Db->Execute($nm_comando))
      {
         $this->Erro->mensagem (__FILE__, __LINE__, "banco", $this->Ini->Nm_lang['lang_errm_dber'], $this->Db->ErrorMsg());
         exit ;
      }
      $_SESSION['sc_session'][$this->Ini->sc_page]['grid_xxxxx_xxxxx']['tot_geral'][0] = "" . $this->Ini->Nm_lang['lang_msgs_totl'] . "";
      $_SESSION['sc_session'][$this->Ini->sc_page]['grid_xxxxx_xxxxx']['tot_geral'][1] = $rt->fields[0] ;
      $rt->Close();
      $_SESSION['sc_session'][$this->Ini->sc_page]['grid_xxxxx_xxxxx']['contr_total_geral'] = "OK";
   }
« Última modificação: Julho 14, 2014, 02:58:08 pm por Alexandre Pereira Bühler »
--
Alexandre Pereira Bühler
https://www.simaoebuhler.com.br
Hospedagem compartilhada Scriptcase desenvolvimento e produção. Temos servidores dedicados Scriptcase.
Eu RTFM todo dia e você?

Haroldo

  • Expert
  • *****
  • Mensagens: 6293
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re:Melhoria na performance com Firebird e Postgresql
« Responder #1 Online: Julho 14, 2014, 03:10:16 pm »
Temos o mesmo problema com Oracle.


Jailton

  • Expert
  • *****
  • Mensagens: 2041
Re:Melhoria na performance com Firebird e Postgresql
« Responder #2 Online: Julho 14, 2014, 03:33:05 pm »
E se o sistema mesmo tiver sendo usado o MySQL em servidores COMPARTILHADOS, eles ficam mandando relatórios, pedindo
para você melhorar o SCRIPT, acusando que esta sobrecarregando o servidor e justamente
o SQL que esta aparecendo é este: SELECT COUNT(*) FROM tbl heehe
O Princípio da Vibração. "Nada está parado, tudo se move, tudo vibra". Caibalion.

Haroldo

  • Expert
  • *****
  • Mensagens: 6293
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re:Melhoria na performance com Firebird e Postgresql
« Responder #3 Online: Julho 14, 2014, 03:41:39 pm »
O Primeiro Select count(*)  acredito que deva haver para a paginação, mas nas quebras, resumos, não mesmo.


Bernhard

  • Administrator
  • Expert
  • *****
  • Mensagens: 1619
Re:Melhoria na performance com Firebird e Postgresql
« Responder #4 Online: Julho 14, 2014, 11:51:19 pm »
Boa noite,

Discutirei sua sugestão com nossa equipe.

att,
Bernhard Bernsmann

Alexandre Pereira Bühler

  • Expert
  • *****
  • Mensagens: 1659
  • Nunca estabeleça um teto para os seus rendimentos.
    • Simão & Bühler Ltda
    • Email
Re:Melhoria na performance com Firebird e Postgresql
« Responder #5 Online: Julho 15, 2014, 07:01:31 am »
Bernhard,
Obrigado pelo apoio.
--
Alexandre Pereira Bühler
https://www.simaoebuhler.com.br
Hospedagem compartilhada Scriptcase desenvolvimento e produção. Temos servidores dedicados Scriptcase.
Eu RTFM todo dia e você?

Bernhard

  • Administrator
  • Expert
  • *****
  • Mensagens: 1619
Re:Melhoria na performance com Firebird e Postgresql
« Responder #6 Online: Julho 17, 2014, 11:02:31 pm »
Alexandre,

Nós que agradecemos. Assim que eu obtiver algum feedback, deixarei você saber.

att,
Bernhard Bernsmann

saulobborges

  • Expert
  • *****
  • Mensagens: 1392
    • SGi Sistemas
    • Email
Re:Melhoria na performance com Firebird e Postgresql
« Responder #7 Online: Julho 17, 2014, 11:28:13 pm »
Alexandre não manjo nada de Postgre mas não seria o caso de usar uma procedure nesse casos?

Andei lendo hoje sobre essas questão e pelo pouco que consegui captar essa lentidão no postgre se deve a maneira com o postgre controla as transações criando vários copias dos dados de uma mesma tabela em um dado momento garantindo que quem iniciou a leitura de dados em um determinado momento tenha os dados exatamente como estavam naquele momento mesmo que uma transação de escrita tenha sido iniciada concorrentemente.

É isso mesmo ou falei besteira?

Acredito que via procedure o SC trate diferente o retorno, já tentou?

Alexandre Pereira Bühler

  • Expert
  • *****
  • Mensagens: 1659
  • Nunca estabeleça um teto para os seus rendimentos.
    • Simão & Bühler Ltda
    • Email
Re:Melhoria na performance com Firebird e Postgresql
« Responder #8 Online: Julho 18, 2014, 05:08:09 am »
Bom dia,
No mysql fica fácil tirar o select count(*) com mysql_num_rows.
Mas hoje tenho que ter hombridade para assumir que tirar o select count(*) do firebird e postgresql não é tarefa fácil.
Até porque não há um equivalente do mysql_num_rows.
Acho que para manter a compatibilidade com outros bancos e diminuir código a netmake escolheu o select count(*).
As soluções  e correções são meros paleativos e estão em:
http://www.firebirdfaq.org/faq5/
https://wiki.postgresql.org/wiki/Slow_Counting
Peço desculpas pelo meu ar acalorado que esta no post e a netmake.
Saulo creio que sua sugestão não dará certo, mas obrigado por se pronunciar a respeito.
« Última modificação: Julho 18, 2014, 05:11:28 am por Alexandre Pereira Bühler »
--
Alexandre Pereira Bühler
https://www.simaoebuhler.com.br
Hospedagem compartilhada Scriptcase desenvolvimento e produção. Temos servidores dedicados Scriptcase.
Eu RTFM todo dia e você?

Haroldo

  • Expert
  • *****
  • Mensagens: 6293
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re:Melhoria na performance com Firebird e Postgresql
« Responder #9 Online: Julho 18, 2014, 11:38:35 am »
No Cobol, montávamos a impressão em matriz, e contávamos os registros, tanto total como das quebras, isso antes da impressão, durante o loop da busca dos registros. Assim se obtinha o total de registros da quebra antes da impressão, e podíamos fazer contas , médias ponderadas, etc, dentro da matriz.

Contra: Exige mais recurso de memória.

A favor: Menos recurso do banco de dados.


Jocimar

  • Expert
  • *****
  • Mensagens: 621
Re:Melhoria na performance com Firebird e Postgresql
« Responder #10 Online: Julho 18, 2014, 01:29:11 pm »
Com o harbour faço o seguinte,

Crio arquivo temporário com os registros válidos através de loop seja por for ... next ou do while ... enddo para a consulta / relatórios, e utilizo as funções sobre este arquivo temporário.
Antes utilizada vetor, que no harbour não consome memória.

Att,

Jocimar
Jocimar de Oliveira

Alexandre Pereira Bühler

  • Expert
  • *****
  • Mensagens: 1659
  • Nunca estabeleça um teto para os seus rendimentos.
    • Simão & Bühler Ltda
    • Email
Re:Melhoria na performance com Firebird e Postgresql
« Responder #11 Online: Janeiro 29, 2015, 11:04:50 am »
Bernhard,
Boa tarde,
Alguma novidade?
--
Alexandre Pereira Bühler
https://www.simaoebuhler.com.br
Hospedagem compartilhada Scriptcase desenvolvimento e produção. Temos servidores dedicados Scriptcase.
Eu RTFM todo dia e você?