[firebase-br] Procedure Remover Tags HTML - A saga continua...

Christian e Ana Luiza Britto chriseana em gmail.com
Qua Jan 6 22:44:50 -03 2016


Oi Carlos,
Muito obrigado pelo empenho e consideração.
Estou acessando uma base local mesmo.
Estou rodando o Firebird 2.5 em um Dell i7 5500U de 2.40gz com disco
SSD no Windows 10.

Achei estranho demorar tanto assim, por isso fiz a pergunta no post.
Estranho ter rodado rápido aí e aqui não...
:(
Grande abraço,
Christian

Em 06/01/16, Carlos H. Cantu<listas em warmboot.com.br> escreveu:
> Eu fiz um teste aqui com sua função, retornando 219 registros. O campo
> com o conteudo html é um blob, media de tamanho de 22K, sendo que a
> diferença é que está armazenado usando charset win1252 e collate
> win_ptbr, e demorou 2 segundos pra retornar (fetch all). Alterando a
> procedure pra forçar os parametros como UTF8, demorou 8 segundos (nada
> mal, considerando que o Firebird teve que converter os charsets).
>
> Sendo assim, começo a desconfiar que a lentidão não se deve a
> procedure, e sim ao fato de que provavelmente você está rodando o
> select acessando uma base remota, via internet, estou certo?
> Infelizmente, o protocolo de comunicação do Firebird é lento em redes
> de alta latência, especialmente se estiver trafegando blobs.
>
> []s
> Carlos H. Cantu
> www.FireBase.com.br - www.firebirdnews.org
> www.warmboot.com.br - blog.firebase.com.br
>
> CeALB> Olá Carlos,
> CeALB> MUITO obrigado pela dica!
>
> CeALB> Faz todo o sentido. Infelizmente, quando fui verificar encontrei na
> CeALB> realidade campos bem grandes. A maioria, como disse, é pequena, mas
> CeALB> cheguei a encontrar um nota com 56.000 caracteres. Com isso não dá
> CeALB> para usar o varchar e o blob fica muito lento...
>
> CeALB> Vou tentar outras alternativas.
> CeALB> Grande abraço,
> CeALB> Christian
>
> CeALB> Em 06/01/16, Carlos H. Cantu<listas em warmboot.com.br> escreveu:
>>> Cada vez que vc manipula uma variável do tipo blob no PSQL (triggers,
>>> procedures, etc), mesmo que mude apenas um byte nele, uma nova "cópia"
>>> do blob todo é criada em memória. Acredito que isso não seja muito bom
>>> em termos de performance ou mesmo de memória consumida.
>>>
>>> Por curiosidade, faça um teste trocando blob por varchar, e veja como
>>> fica a performance. Obviamente, o conteúdo não poderá exceder o limite
>>> do varchar (32765).
>>>
>>> PS: A variável TagFound pode ser tranquilamente um varchar, afinal,
>>> uma tag nunca será maior que o limite dele.
>>>
>>> []s
>>> Carlos H. Cantu
>>> www.FireBase.com.br - www.firebirdnews.org
>>> www.warmboot.com.br - blog.firebase.com.br
>>>
>>> CeALB> Olá Colegas,
>>>
>>> CeALB> Preciso de uma rotina que retire todos os tags html de um campo,
>>> CeALB> revomovendo tudo o que estiver dentro dos <> apenas (Os coódigos
>>> de
>>> CeALB> acentuação podem ser ignorados).
>>>
>>> CeALB> Seguindo os conselhos do colega Gladiston, poderia tentar uma
>>> função
>>> CeALB> externa. Mas, pretendo rodar o banco em diversas plataformas
>>> CeALB> (Mac/Win/Linux) o que dificulta o processo, pois precisaria
>>> compilar
>>> a
>>> CeALB> tunção em diferentes plataformas...
>>>
>>> CeALB> Decidi, então, fazer via Stored Procedure. Ficou assim:
>>>
>>>
>>>
>>> CeALB> CREATE OR ALTER PROCEDURE STRIPALLHTML (
>>> CeALB>     htmlstring blob sub_type 1 segment size 80)
>>> CeALB> returns (
>>> CeALB>     stripedstring blob sub_type 1 segment size 80)
>>> CeALB> as
>>> CeALB> declare variable tagbegin integer;
>>> CeALB> declare variable tagend integer;
>>> CeALB> declare variable tagfound blob sub_type 1 segment size 80 collate
>>> unicode_ci_ai;
>>> CeALB> begin
>>> CeALB>   TagBegin = position ('<', HTMLString);
>>>
>>> CeALB>   while (:TagBegin > 0) do
>>> CeALB>   begin
>>> CeALB>     TagEnd = position ('>', HTMLString, TagBegin);
>>> CeALB>     TagFound = substring (HTMLString FROM TagBegin FOR ((TagEnd -
>>> CeALB> TagBegin) + 1));
>>> CeALB>     HTMLString = replace (HTMLString, TagFound, '');
>>> CeALB>     TagBegin = position ('<', HTMLString);
>>> CeALB>   end
>>> CeALB>   StripedString = HTMLString;
>>> CeALB>   suspend;
>>> CeALB> end
>>>
>>> CeALB> Para chamá-la eu uso o seguinte comando:
>>>
>>> CeALB> select items.note, (SELECT stripedString FROM StripAllHTML
>>> CeALB> (items.note)) from items
>>>
>>> CeALB> A procedure retorna exatamente o resultado que eu preciso. O
>>> problema
>>> CeALB> é que está LENTA DEMAIS. Rodando em um banco com 400 itens o
>>> IBExpert
>>> CeALB> demora quase 2 minutos para dar o retorno... Em média cada campo
>>> NOTE
>>> CeALB> possui 2.000 caracteres...
>>>
>>> CeALB> Estou fazendo algo errado?
>>> CeALB> Podem dar uma DICA?
>>>
>>> CeALB> Abraços,
>>> CeALB> Christian
>>>
>>>
>>> ______________________________________________
>>> 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://www.firebase.com.br/pesquisa_lista.html
>>>
>
>
> ______________________________________________
> 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://www.firebase.com.br/pesquisa_lista.html
>




Mais detalhes sobre a lista de discussão lista