Как я могу оптимизировать этот запрос? - PullRequest
0 голосов
/ 01 мая 2009

Как я могу оптимизировать этот запрос? Кажется, должен быть гораздо более простой способ сделать это. Цель состоит в том, чтобы его можно было легко превратить в оператор удаления.

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
                 )

Ответы [ 2 ]

3 голосов
/ 01 мая 2009

Быстрый взгляд на этот запрос дает мне следующее:

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

Похоже, вы пытаетесь найти все команды, которые участвуют в турнире, но отсутствуют в таблице регистрации. Это точно?

Кроме того, я хотел отметить, что объединение будет выполняться быстрее, чем набор подзапросов, особенно если подзапросы зависят от каждой строки (в вашем случае, они делают).

Приветствия
Eric

0 голосов
/ 01 мая 2009

Комментируя запрос Эрика в этой теме, я бы рекомендовал (из моего фона mssqlserver) вместо этого использовать экзистенциальную проверку. Таким образом (1) делает ваше намерение более ясным, а (2) дает оптимизатору возможность прекратить проверку на соответствующий team_id после того, как найден первый (так как> = 1 соответствующая строка приводит к тому, что экзистенциальная проверка будет ложной). Э.Г.

выберите т. * от команда т внутреннее расписание соединения s на t.schedule_id = s.schedule_id событие внутреннего соединения e на s.event_id = e.event_id где e.event_id = 183 и не существует (выберите * из регистрации, где team_id = t.team_id)

Но, может быть, есть какие-то специфические проблемы с MySQL?

...