[firebase-br] UNION vs OR

Eduardo Bahiense eduardo em icontroller.com.br
Sex Jan 22 11:40:37 -03 2010


> Pelos testes que fiz, se o critério informado no Like não filtrar
> bastante, o union sai perdendo, e feio. Porém, quando o critério
> filtra o suficiente (por exemplo, informar mais de 5 letras para o
> nome/apelido) o union executa em bem menos tempo e percorre bem menos
> registros.

Isso não parece lógico e insolúvel? se muitos registros satisfazem a 
condição, além do tempo de varredura, existe o volume de FETCH, ou seja, 
o Resultset será maior. Neste caso (UNION) 2 resultados que serão que 
ser unificados em um só, excluindo-se as duplicidades.

Posto que, nesse caso, o gargalo está no volume do resultado, lhe resta 
otimizar o processo limitando a quantidade com SELECT FIRST n, que 
naturalmente, não trará ao usuário todas as respostas possíveis, o que o 
forçará a ser mais específico em sua consulta.

Usuários (mesmo nós quando nos colocamos nessa posição) são preguiçosos 
e se o sistema pede parte do nome, digitamos, por exemplo, somente "A". 
Se o sistema só trouxer uns 20 resultados e ele não achar o que está 
esperando, logo se acoustumará a digitar "Alberto" para o resultado vir 
com maior relevância.

Por aqui temos um cliente com um cadastro de pessoas com mais de 800.000 
registros e com mais de 300 usuários simultâneos. Frequentemente, 
tínhamos lentidão no servidor por causa da consulta de pessoas no 
cadastro. Solução: desenvolvemos um algorítimo que faz o seguinte:

function localizar(texto)

if SELECT FIRST 50 NOME = texto
	retorna o que veio
else if SELECT FIRST 50 NOME STARTING WITH texto
	retorna o que conseguiu
else
	SELECT FIRST 50 NOME CONTAINING texto e retorna o que vier
end

Observe que as duas primeiras formas utilizam índices e só se usa a 
última se as duas primeiras não tiverem sucesso.

Isso resolveu a sobrecarga no server, os usuários pularam um pouquinho 
no início, mas logo se acostumaram a serem mais específicos nas 
consultas, mormente quando argumentávamos que isso impedia que os 
sistema ficasse lento para outras pessoas, inclusive de outras áreas.

É isso, qualquer coisa, tamos aí.


Eduardo





Mais detalhes sobre a lista de discussão lista