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

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


Oi Carlos,
Se quiser dar uma olhada no meu banco, disponibilizei aqui:

https://copy.com/8ayu1Yl6DJr9G1ds

Grande abraço,
Christian

Em 06/01/16, Christian e Ana Luiza Britto<chriseana em gmail.com> escreveu:
> 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