다음과 같은 쿼리가 더 좋은 결과를 보이는데 이유가 뭔지 궁금합니다.
139
12 asked
SELECT e.emp_id
, s.avg_salary
, s.max_salary
, s.min_salary
FROM EMP e,
(select emp_id,
ROUND(AVG(annual_salary), 0) avg_salary,
ROUND(MAX(annual_salary), 0) max_salary,
ROUND(MIN(annual_salary), 0) min_salary
from SALARY
where emp_id BETWEEN 10001 and 10100
GROUP BY emp_id) s
WHERE e.emp_id = s.emp_id;
처음에 답을 안 보고 제가 개선해본 쿼리인데,
필터링 조건을 salary에 넣어주고, 이걸 조인해서(emp의 primary key) 나오는 결과인데 미세하게 더 빠르네요.!
정답 쿼리가 조금 더 느린 이유는 salary 테이블을 3번 접근해서 그런거 같은데(index를 활용하더라도) 맞는지 궁금합니다.
Answer 1
0
안녕하세요, 인프런 AI 인턴입니다.
Anfield님께서 설명해주신 쿼리의 경우, SALARY에서 서브쿼리를 사용하여 emp_id에 대한 그룹별 통계를 계산하고 EMP 테이블과 조인을 하였습니다. 이러한 접근 방법은 효율적으로 보일 수 있습니다.
잠깐 설명드리면, 서브쿼리에서 SALARY 테이블의 데이터를 emp_id 기준으로 그룹화하여 평균, 최대, 최소 등을 계산하고 나서 이를 EMP 테이블과 조인하는 구조입니다. 이 경우, SALARY 테이블에 대한 서브쿼리를 먼저 실행하고 그 결과를 사용하여 조인하는 방식이므로, SALARY 테이블에 대한 접근이 제한되며 더 나은 성능을 보일 수 있습니다.
실제로 explain 플랜을 봤을 때, DERIVED 단계에서 SALARY 테이블에 대해 range 스캔을 사용하고 PRIMARY 키로 빠르게 참조하고 있어, 결과적으로 EMP 테이블과의 조인이 빠르게 이루어진 것으로 보입니다.
Anfield님께서 느끼신 것처럼 SALARY 테이블에 대한 접근 횟수가 3번이기 때문에 디스크 I/O가 더 많이 일어날 수 있으며, 이러한 점이 전체적인 쿼리 성능에 미세한 차이를 줄 수 있습니다.
이러한 설명이 도움이 되셨길 바랍니다! 추가적인 질문이 있으시면 언제든지 말씀해 주세요.
패키지 구분에 대해 궁금한게 있습니다
0
10
1
노션 링크도 안 열리고, 알려준 vercel도 실행이 안됩니다.
0
11
1
Substack 1년 제공
1
22
3
특별 학습 자료 프로모션 1년 멤버십 무료 제공 문의드립니다
0
27
2
스프링부트 서버 에러나요
0
17
1
코드를 첨부해야하는 이유가 있나요?
0
20
2
간단한 오타 제보입니다.
0
19
1
큰 범위 조회 시 EXPLAIN의 rows 값이 정확하지 않은 이유가 궁금합니다.
0
35
2
실제 FK제약조건을 설정하지 않는이유
0
36
2
조회속도 개선에서 더 개선하는 방법이 궁금합니다.
0
28
2
Sequence 관련 질문
1
32
2
Image Only Query
1
29
2
Free Edition 실습 영상은 아직 업데이트전인가요?
0
22
1
라이브 운영중인 환경의 테이블에 인덱스 추가시 고려사항
0
36
2
상품 정보 크롤링
0
29
2
JPA Repository 질문이 있습니다!
1
33
2
페이지네이션 처리를 쿼리에서 하는 방식 질문
1
36
1
수강기간 연장
0
27
1
FTS 방식으로 수행하는 나쁜 SQL 에서 질문이 있습니다.
0
53
0
7-8 질문
0
55
1
rollup mariadb 11 ver 기준
0
128
1
use index, force index 힌트 질문
0
232
1
BNL Join 사용
0
129
1
select_type 에서 'simple' 경우 각각의 테이블이 '드라이빙' 또는 '드리븐' 인지 어떻게 알수 있나요?
0
106
0


