Eu tenho várias tabelas com a chave primária (mês, ano, número) e diferentes cardinalidades diferem um pouco. Para a tupla (mês, ano) a história não vai muito longe, isso provavelmente não crescerá além de 50 a muito longo prazo. Para cada tupla (mês, ano) não há mais de 2 milhões de números únicos. Quero saber quais combinações de mês e ano estão disponÃveis. Eu faço isso usando esta consulta:
select month, year from table group by month, year
Isso retorna o resultado correto, mas não parece ser muito eficiente. Qual é uma maneira eficiente de obter esse resultado (utilizando o Ãndice único)?
O consultor de ajuste sugere adicionar um Ãndice mês-ano para esta consulta, mas isso parece um desperdÃcio porque um Ãndice maior já está disponÃvel.
Você pode usar uma variação da seguinte técnica - que força varreduras repetidas de alcance 'MIN/MAX':
Suposições
number
não é nulo (o que não pode ser como está no PK, mas mencionei porque há uma maneira de contornar se nulos forem permitidos)banco de ensaio:
consulta normal:
técnica min/max:
Algumas explicações em resposta aos comentários:
Em cada caso (o testbed e a consulta min/max), a cláusula de fatoração da subconsulta apenas gerou uma lista de tuplas (ano, mês):
Então a técnica usa uma subconsulta na
select
cláusula para verificar se alguma linha está presente para o (mês, ano) - esta subconsulta necessariamente deve produzir apenas no máximo 1 linha:Isso é muito rápido porque faz uso da natureza ordenada do PK - no entanto, ele precisa ser executado uma vez para cada mês - se houver milhões de linhas para cada mês, isso faz sentido, mas não se houver poucas o suficiente para caber um pequeno número de blocos.
Aqui está uma solução usando a mesma técnica de Jack Douglas (+1). Ele produz um número idêntico de resultados consistentes usando seu testbed, mas se é mais fácil de entender ou não, depende do observador.
Esta opção usa o select from dual para direcionar a consulta e o select from foo apenas para decidir quais datas manter.
A mesma consulta também poderia ser escrita assim: