2013-11-20 1 views
0

저는 실행 속도가 느린 업데이트 문을 가지고 있으며 where 절을 join 절로 이동하면 성능이 향상 될지 궁금합니다. 매우 큰 테이블 이제where 절을 join 절로 이동하면 성능이 향상됩니까?

update T1 inner join (select ID, GROUP_CONCAT(x) as X from T3 group by ID) as T2 

on T1.ID=T2.ID set T1.X=T2.X where T1.TYPE='something'; 

(기록의 수백만), 이렇게 빨리 될 것이다 : 여기에 쿼리입니까?

update T1 inner join (select ID, GROUP_CONCAT(x) as X from T3 group by ID) as T2 

on T1.ID=T2.ID and T1.TYPE='something' set T1.X=T2.X; 
+0

T1의 행에서 TYPE = '무언가'가 몇 퍼센트입니까? T2에있는 대응하는 행의 분율은 동일합니까? T1의 각 행에 대해 T2에 일반적으로 몇 개의 행이 있습니까? – Bohemian

답변

0

쿼리는 두 방법 모두 동일하게 최적화되어야합니다.

내부 쿼리가 외부 쿼리와 상관 관계가 없기 때문에 두 방법 모두 차선책 일 수 있습니다. 귀하의 쿼리는 파생 테이블 T2에 대한 가능한 모든 행을 포함하는 암시 적 임시 테이블을 생성합니다 - 쿼리 select ID, GROUP_CONCAT(x) as X from T3 group by ID 만 실행 한 것과 동일한 결과 - 서버는 T1에 조인 할 수없는 테이블을 버립니다 업데이트를 수행하기 위해 나머지를 사용합니다.

이것은 아마도 최적의 경로가 아닙니다. t1.TYPE이 = '뭔가'T1의 행의 큰 비율을 포함하지 않는

,이 작업을 수행하는 것이 더 효율적이어야한다 :

UPDATE t1 
    SET t1.x = (SELECT GROUP_CONCAT(x) FROM T3 WHERE T3.id = T1.id GROUP BY T3.id) 
WHERE t1.TYPE = 'something'; 

내부 하위 쿼리가 외부 하위 쿼리 상관 관계 및 전용 WHERE 절과 일치하는 T1의 행에 대해 실행됩니다.

관련 문제