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

Christian e Ana Luiza Britto chriseana em gmail.com
Qua Jan 6 23:19:57 -03 2016


Puxa, que coisa estranha!

Vou quebrar a cabeça aqui... MUITO obrigado
Grande abraço,
Christian


Em 06/01/16, Carlos H. Cantu<listas em warmboot.com.br> escreveu:
> Testei com seu banco, e um fetchall demorou 8s:
>
> Query Time
> ------------------------------------------------
> Prepare       : 16,00 ms
> Execute       : 7.328,00 ms
> Avg fetch time: 16,43 ms
>
> Minha máquina é um i7 4810, Firebird 2.5.5, Windows 10 64bits.
>
> []s
> Carlos H. Cantu
> www.FireBase.com.br - www.firebirdnews.org
> www.warmboot.com.br - blog.firebase.com.br
>
> CeALB> Oi Carlos,
> CeALB> Se quiser dar uma olhada no meu banco, disponibilizei aqui:
>
> CeALB> https://copy.com/8ayu1Yl6DJr9G1ds
>
> CeALB> Grande abraço,
> CeALB> Christian
>
> CeALB> 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
>>>>>>>> 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
>>>>
>>>
>
>
> ______________________________________________
> 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