Como posso optimizar esta consulta?
Pergunta
Como posso optimizar esta consulta? Parece que deve haver uma maneira muito mais fácil de fazer isso. O objetivo é que ele ainda será capaz de ser facilmente transformado em uma instrução de exclusão.
SELECT * FROM team
WHERE team_id IN (
SELECT team_id
FROM (
SELECT team.team_id, (
SELECT COUNT(*)
FROM signup
WHERE signup.team_id = team.team_id
) AS members
FROM team, schedule, event
WHERE team.schedule_id = schedule.schedule_id
AND schedule.event_id = event.event_id
AND event.event_id =183) AS t
WHERE members = 0
)
Solução
Um rápido olhar sobre esta consulta dá-me isto:
select
t.*
from
team t
inner join schedule s on t.schedule_id = s.schedule_id
inner join event e on s.event_id = e.event_id
left outer join signup sp on t.team_id = sp.team_id
where
e.event_id = 183
and sp.team_id is null
Parecia que você está tentando encontrar todas as equipes que estão em um evento, mas não estão na tabela de inscrição. É este precisa?
Além disso, eu queria nota que será mais rápido para fazer junta-se, em seguida, um monte de subconsultas, especialmente se os subqueries depender de cada linha (no seu caso, eles fazem).
Cheers,
Eric
Outras dicas
Comentando em consulta de Eric nesta discussão, eu recomendaria (do meu fundo mssqlserver) para usar uma verificação existencial vez. Ao fazê-lo (1) faz sua intenção mais clara e (2) dá o otimizador a oportunidade de parar o exame para um team_id correspondência após o primeiro é encontrado (desde> = 1 linha correspondente faz com que a verificação existencial ser falso). Por exemplo.
selecione t. * de equipe t junção interna programação s em t.schedule_id = s.schedule_id junção interna evento e em s.event_id = e.event_id Onde e.event_id = 183 e não existe (seleccionar * de inscrição onde team_id = t.team_id)
Mas talvez existam específica mysql perf preocupações.