[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