해결된 질문
작성
·
25
0
안녕하세요 선생님.
"26_학사관리시스템(SQL실습3)"에 있는 쿼리 중에 조인과 서브쿼리 중 대체적으로 어떤 방법이 성능에 더 좋은지 궁금해서 질문드립니다.
두 가지 질의에 대해서 3가지 방법으로 조인과 서브쿼리를 섞어보았는데 조언 부탁드립니다.
감사합니다.
-- 교양엉어 과목을 수강 신청한 학생의 이름
-- 1. JOIN 2번
select s.student_name
from student_course sc
JOIN student s on sc.student_id = s.student_id
JOIN course c on sc.course_code = c.course_code
where c.course_name = '교양 영어';
-- 2. JOIN 1번, where 절에 subQuery 1번
select s.student_name
from student_course sc
JOIN student s on sc.student_id = s.student_id
where course_code = (select course_code
from course
where course_name = '교양 영어');
-- 3. where 절에 subQuery 2번
select s.student_name
from student s
where s.student_id in (select student_id
from student_course
where course_code = (
select course_code
from course
where course_name = '교양 영어'
));
-- 가교수의 과목을 수강신청한 학생수를 출력
-- 1. JOIN 2번
select count(student_id) as cnt -- count(student_id) as cnt
from student_course sc
JOIN course c on sc.course_code = c.course_code
JOIN professor p on c.professor_code = p.professor_code
where p.professor_name = '가교수';
-- 2. JOIN 1번, WHERE 절에 subQuery 1번
select count(sc.student_id) as cnt
from student_course sc
where course_code in (select c.course_code
from course c
JOIN professor p on c.professor_code = p.professor_code
where p.professor_name = '가교수');
-- 3. where 절에 subQuery 2번
select count(sc.student_id) as cnt
from student_course sc
where sc.course_code in (select c.course_code
from course c
where professor_code = (select professor_code
from professor p
where professor_name = '가교수'));
답변 2
0
문의 주신부분은 데이터베이스의 크기, 인덱스 설정 여부, 데이터 분포 등의 요인에 따라 차이가 발생할 수 있습니다. 2가지 문의 중 첫번째 질문에 대한 견해를 드리겠습니다.
1.)
select s.student_name
from student_course sc
JOIN student s on sc.student_id = s.student_id
JOIN course c on sc.course_code = c.course_code
where c.course_name = '교양 영어';
위의 경우가 명확한 JOIN 사용으로 읽기 쉽고 유지보수가 용이해서 JOIN시 불필요한 정보의 로딩을 줄이면 가장 효율성이 있을 수 있습니다.
JOIN시 student_course와 course 테이블에 적절한 인덱스가 설정되어 있다면 더 빠르게 동작 할듯합니다.
2.)
select s.student_name
from student_course sc
JOIN student s on sc.student_id = s.student_id
where course_code = (
select course_code
from course
where course_name = '교양 영어'
);
JOIN을 최소화하여 중간 데이터 처리가 줄어들고 course 테이블이 작은 경우, 서브쿼리가 빠르게 처리 되면 성능이 빨라질 수 있습니다.
단 서브쿼리가 메인 쿼리와 독립적으로 실행되므로 서브쿼리의 성능에 영향을 미칠수 있습니다.
3.)
select s.student_name
from student s
where s.student_id in (
select student_id
from student_course
where course_code = (
select course_code
from course
where course_name = '교양 영어'
)
);
JOIN 없이 서브쿼리만으로 간결한 구조이나 IN 연산자가 큰 데이터에 대해 비효율적으로 동작할 가능성이 있습니다.
1번이 가장 효율성이 있고 데이터 크기와 인덱스에 따라 2,3 번 순으로 성능이 평가 될듯합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 맛땅님.
질문하신 조인과 서브쿼리를 활용한 SQL 성능 최적화에 관한 내용을 설명드리겠습니다. 조인과 서브쿼리 중 어떤 방법이 더 효율적인지는 데이터베이스의 구조, 인덱스 설정, 데이터의 크기에 따라 달라질 수 있습니다. 그러나 일반적으로, 조인을 사용하는 것이 더 효율적인 경우가 많습니다.
조인(JOIN) 사용:
student_course
와 student
를 조인하여 student_name
을 얻는 예제에서는 조인의 이점을 잘 활용할 수 있습니다.서브쿼리 사용:
다음 게시글 또한 관련 질문에 대한 유용한 정보를 제공하고 있으니 참고하시기 바랍니다:
- DB 성능 최적화를 위한 효율적인 SQL 작성 요령
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
말씀 감사합니다!!