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

Carlos H. Cantu listas em warmboot.com.br
Qua Jan 6 22:29:12 -03 2016


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
>>





Mais detalhes sobre a lista de discussão lista