2009-04-30 5 views
0

어떻게이 쿼리를 최적화 할 수 있습니까? 이 작업을 수행하는 훨씬 쉬운 방법이 있어야합니다. 목표는 여전히 쉽게 delete 문으로 전환 될 수 있다는 것입니다.이 쿼리를 어떻게 최적화 할 수 있습니까?

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 
       ) 
+0

데이터에 대해 더 자세히 설명하고 쿼리가 수행해야하는 작업/반환 할 수 있습니까? –

+1

그리고 코드를 좀 더 형식화하는 것이 어떻습니까? –

+1

코드를 형식화했습니다. 모든 SQL을 대문자로 작성하고 테이블, 컬럼 및 별명을 작게 작성하는 것이 매우 유용합니다. 그렇다면 코드를 들여 쓰는 것도 좋은 생각입니다. 이렇게하면 쿼리가 실제로 무엇을하는지 볼 수 있습니다. – markus

답변

3

이 쿼리에서 빠른 눈이 나에게주는이 :

당신이 이벤트에 있지만 가입 테이블에없는 모든 팀을 찾기 위해 노력하고있는 것처럼 그것은 보았다
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 

. 정확합니까?

또한, 특히 하위 쿼리가 각 행에 의존하는 경우 조인을 수행하는 것이 더 빠르다는 점에 유의하고 싶습니다.

건배,
에릭, 나는 (내 MSSQLSERVER 배경에서) 추천이 스레드에서 에릭의 질의에 대해 언급

+0

고마워, 그게 내가 원하는거야. 다른 유형의 조인을 잘 사용할 수있는 작업을 계속하고 있습니다. (두 번째 내부 조인에 대한 쿼리는 실제로 s.event_id = e.event_id (schedule_id가 아님)임을 유의해야합니다. – Craig

+0

수정되어 도움이 되었기 때문에 기쁩니다! – Eric

+1

이제 SQL을 더 잘 사용 했으므로 쿼리 계획을 확인하십시오. 당신이 최적화를 완료하고자한다면 당신은 그것이 또한 빠르다는 것을 보장하기를 원할 것입니다. 테이블이 큰 경우 (또는 결국 커질 경우) 올바른 인덱스가없는 경우 쿼리가 느리게 실행됩니다. 색인을 추가하고 쓰기가 느린 경우 다른 질문을 게시하면 답변을 드리겠습니다. – yetanotherdave

0

대신 실존 적 검사를 사용합니다. 이렇게하면 (1) 사용자의 의도가 명확 해지고 (2) 일치하는 team_id가 발견 된 후 옵티마이 저가 일치하는 team_id에 대한 검사를 중지 할 수있는 기회가 제공됩니다 (> = 1 일치하는 행으로 인해 실존 검사가 false가됩니다). 예.

t를 선택한다. * 을 팀 내에서 t가 에 일정의 가입 t.schedule_id = s.schedule_id 내측 s.event_id = e.event_id 의 이벤트, 즉 가입 여기서 e.event_id = 183 및 존재하지 않습니다. (select * from team_id = t.team_id)

하지만 MySQL 관련 perf 문제가있을 수 있습니다.

관련 문제