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

Carlos H. Cantu listas em warmboot.com.br
Qua Jan 6 23:15:38 -03 2016


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