Eu estava me perguntando sobre o desempenho relativo das soluções fornecidas nas respostas a uma pergunta no stackoverflow , resolvi fazer alguns testes.
O OP queria obter a primeira linha correspondente, dado um conjunto de condições com precedência decrescente. Ambas as soluções envolviam uma pseudocoluna, mas uma (a minha) envolvia várias SELECT
declarações UNION ALL
unidas, enquanto a outra construía uma CASE
expressão.
Compartilho meus resultados na esperança de que alguém ache isso útil.
Seu design de teste é falho. Você está testando resultados incorretos .
Adicionei uma resposta à pergunta no SO a que você está se referindo .
Na sua versão CASE, você não pode adicionar arquivos
ORDER BY col1, col2
. Teria que serORDER BY precedence
. Mas ainda estaria incorreto. Você teria que fazerORDER BY
a soma das pontuações para condições individuais para obter primeiro as linhas que atendem à maioria das condições.Da mesma forma, sua versão UNION ALL produz resultados incorretos.
Porém, nada disso parece necessário, existe uma solução mais simples e rápida com
UNION ALL
. Consulte minha resposta à pergunta SO ou use o sqlfiddle para brincarPara uma tabela com apenas algumas linhas, não consegui ver nenhuma diferença no tempo de execução (embora os planos de consulta fossem diferentes, os resultados não eram mostrados).
Em seguida, reutilizei uma tabela de teste de um experimento anterior. Esta tabela consiste em 436421 linhas e possui a seguinte estrutura:
Agora as execuções de teste foram as seguintes (as condições escolhidas retornam menos de 2% de todas as linhas sem
LIMIT
):versão do CASO
versão UNION ALL
(Ambos foram executados várias vezes para excluir efeitos de cache.)
Nesta configuração, o
UNION ALL
foi mais rápido porque atingiu muito menos linhas - isso se reflete tanto nas varreduras sequenciais quanto na classificação.Agora criei dois índices:
As execuções subsequentes deram resultados muito diferentes:
Versão CASE com índices
Versão UNION ALL com índices
Esta é uma diferença enorme, e desta vez
CASE
foi o vencedor. Um plano de execução não poderia ser mais simples do que isso...