Por que o agrupamento em uma subconeração causa problemas
-
21-09-2019 - |
Pergunta
Quando incluo as duas linhas comentadas na subconsulta a seguir, parece que leva uma eternidade até que meu servidor ASE Sybase 12.5 obtenha resultados. Sem essas 2 linhas, a consulta funciona bem. O que há de tão errado com esse agrupamento?
select days_played.day_played, count(distinct days_played.user_id) as OLD_users
from days_played inner join days_received
on days_played.day_played = days_received.day_received
and days_played.user_id = days_received.user_id
where days_received.min_bulk_MT > days_played.min_MO
and days_played.user_id in
(select sgia.user_id
from days_played as sgia
where sgia.day_played < days_played.day_played
--group by sgia.user_id
--having sum(sgia.B_first_msg) = 0
)
group by days_played.day_played
Solução 3
Ok, descobri qual era o problema que tinha que incluir ID de usuário na subconsulta: "Onde Days_played.User_Id = sgia.user_id e sgia.day_played <yays_played.day_played"
Outras dicas
Descubra o que a consulta faz usando o ShowPlan para mostrar a explicação.
Nesse caso, você não pode eliminar a subconsulta, fazendo parte da consulta principal?
Você poderia tentar reescrever a consulta da seguinte maneira?
select days_played.day_played,
count(distinct days_played.user_id) as OLD_users
from days_played
inner join days_received on days_played.day_played = days_received.day_received
and days_played.user_id = days_received.user_id
where days_received.min_bulk_MT > days_played.min_MO
and 0 = (select sum(sgia.B_first_msg)
from days_played as sgia
where sgia.user_id = days_played.user_id
and sgia.day_played < days_played.day_played
)
group by days_played.day_played
Eu acho que isso deve lhe dar melhor desempenho ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow