2013-07-23 2 views
0

이 게시물에 : SQL Query to get the data.MAX는() 쿼리의 성능을 향상합니까?

첫 번째 답은 2가

SELECT students.student_id,student_name,father_name,mother_name, 
      COUNT(student_addresses.student_id) AS total_addresses,  
      COUNT(student_phones.student_id) AS total_phones 
    FROM students,student_phones,student_addresses 
    WHERE students.student_id = student_phones.student_id AND 
      students.student_id = student_addresses.student_id AND 
      students.student_id = 7 
    GROUP BY BY students.student_id,student_name,father_name,mother_name; 

동안 :

SELECT s.student_id, 
     max(s.student_name) student_name, 
     max(s.father_name) father_name, 
     max(s.mother_name) mother_name, 
     COUNT(distinct a.student_address_id) total_addresses,  
     COUNT(distinct p.student_phone_id) total_phones 
FROM students s 
LEFT JOIN student_phones p ON s.student_id = p.student_id 
LEFT JOIN student_addresses a ON s.student_id = a.student_id 
WHERE s.student_id = 7 
GROUP BY s.student_id 

이제 질문 : 두 개의 쿼리 사이에 상당한 차이가 그 성능에 관해서? MAX()의 사용이 두 번째 쿼리의 실행 시간에 영향을 줍니까?

나는 대답하지만 운이 없다. 나는 이것에 대한 명확하고 구체적인 설명을 원한다.

+0

기독교인, 나는 Max가 내부에서 외부 조인으로의 변화에 ​​영향을 미치지 않을 것이라고 생각합니다. 정말로보고 싶다면 집계 함수의 사용을 제외하고 두 쿼리를 동일하게 만들 것입니다. – asantaballa

+0

GROUP BY IN은 성능을 향상시키지 않습니다. –

답변

1

네 개의 열이 모두 고유 한 경우에도 두 쿼리가 동일한 작업을 수행하지 않습니다 (students.student_id, student_name, father_name, mother_name).

논리 관점에서 두 쿼리는 동일하지 않습니다. 첫 번째는 전화가 없거나 주소가없는 학생에게는 행을 반환하지 않습니다. 두 번째 학생들은 그러한 학생들을 돌려 보낼 것입니다. 또한 카운트 값은 다릅니다 (데이터에 따라 다름). 성능 관점에서

는 큰 차이점은 다음과 같습니다

 COUNT(student_addresses.student_id) AS total_addresses,  
     COUNT(student_phones.student_id) AS total_phones 

대 : count(distinct)이 더 비싸다 사용

 COUNT(distinct student_addresses.student_id) AS total_addresses,  
     COUNT(distinct student_phones.student_id) AS total_phones 

의 SQL 엔진은 모든 값의 목록을 유지하기 때문. 극단적 인 경우에는이 값이 메모리를 초과 할 수 있으며 더 많은 I/O 작업이 발생합니다. count()의 경우 엔진은 fiddly 목록 작업을 수행하는 대신 번호에 하나를 추가합니다.

마찬가지로 오버 헤드 min()max()도 최소한입니다. 엔진은 비교를 수행하고 값을 덮어 씁니다. 이것은 성능에 영향을 미치지 않는 추가 작업의 작은 iota입니다. 이 문제를 해결하려면 group by 키가 더 짧아야합니다. 짧은 키는 사용되는 기본 알고리즘에 따라 성능에 영향을 줄 수 있습니다. 그럼에도 불구하고 두 쿼리 모두 동일한 데이터 양을 group by이 처리하므로 알고리즘에 관계없이 키 길이의 전체적인 차이가 최소화 될 수 있습니다.

즉, 성능 차이는 count(distinct)이며, max()이 아닙니다. 그것이 정말로 필요한 것인지 결정하고 그에 따라 쿼리를 작성해야합니다. ANSI 표준 조인 구문을 사용하기 때문에 두 번째 형식이 더 좋습니다.

+0

지적 해 주셔서 고맙습니다. 즉, GROUP BY 절에있는 많은 필드 대신에'MAX()'를 사용하면 같은 필드에서 같은 select 쿼리를 사용하면 성능이 더 좋아질 것입니다. –

+0

@ChristianMark. . . 아니, 그건 내가 말한 것이 아니다. 나는 성능상의 이득이 있다면, 최소화 할 것이라고 말했다. 추가적인 함수 호출을위한 약간의 오버 헤드가 있습니다. 더 짧은 키를 사용하면 약간의 이점이있을 수 있습니다. 'group by '에 대한 전반적인 작업은이 작은 효과들 중 하나를 휩쓸 ​​것입니다. –

+0

아 .. 죄송합니다. 나는 단지 설명을 요구한다. :) 고마워! –

관련 문제