Estou usando o Postgres 9.5. Quero selecionar alguns registros, mas somente se eles tiverem pelo menos uma associação em outra tabela. Eu cheguei a esta consulta:
select distinct m.name, m.id
from machines m, parts rt
where m.id = rt.machine_id
and m.name like '%Name%';
mas não acho que isso seja particularmente eficiente, pois se houver 50.000 associações, acho que todas estão carregadas e depois "distintas", o que parece um pouco ineficiente. Existe uma maneira mais eficiente de verificar o carregamento de um registro, mas apenas se ele tiver uma ou mais associações?
A forma como sua consulta está estruturada, você pode apenas escrevê-la usando uma
EXISTS
expressão:Se você deseja que a consulta seja eficiente, leve em consideração que a parte mais difícil provavelmente será verificar a máquina
name
. Considere indexarmachines.name
usando um arquivotrigram index
. Os índices trigramas permitemLIKE '%something%'
condições de localização rápida.Muito provavelmente, o planejador de banco de dados fará um plano de execução onde primeiro encontrará as máquinas que
name
são LIKE '%Name%' (usando oname_like_idx
índice), então, para cada máquina neste subconjunto, ele verificará se há partes associadas a eles; se assim for, eles serão parte do resultado.Por questões de eficiência, assume-se também que existe um índice em
parts.machine_id
, pois será assim que o PostgreSQL verificará eficientemente a existência da parte. Semachine_id
for uma chave estrangeira , é sempre aconselhável indexá-la.Esta consulta não precisa
DISTINCT
(assumindo que osid
s já são únicos).