BETWEEN
deveria superam IN
neste caso (mas faça medir e verificar os planos de execução também!), especialmente como n
cresce e como as estatísticas ainda são precisas. Vamos assumir:m
é o tamanho da sua tabelan
é o tamanho do seu intervalo
O índice pode ser usado (n
é minúsculo comparado a m
)
-
Em teoria,BETWEEN
pode ser implementado com um único "range scan" (Oracle speak) no índice de chave primária e, em seguida, percorrer no máximon
nós folha de índice. A complexidade seráO(n + log m)
-
IN
geralmente é implementado como uma série (loop) den
"varreduras de intervalo" no índice de chave primária. Comm
sendo o tamanho da tabela, a complexidade será sempreO(n * log m)
... o que é sempre pior (desprezível para tabelas muito pequenasm
ou intervalos muito pequenosn
)
O índice não pode ser usado (n
é uma parte significativa de m
)
De qualquer forma, você obterá uma verificação completa da tabela e avaliará o predicado em cada linha:
-
BETWEEN
precisa avaliar dois predicados:um para o limite inferior e outro para o limite superior. A complexidade éO(m)
-
IN
precisa avaliar no máximon
predicados. A complexidade éO(m * n)
... o que é sempre pior, ou talvezO(m)
se o banco de dados pode otimizar oIN
list para ser um mapa de hash, em vez de uma lista de predicados.