인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

맛땅님의 프로필 이미지
맛땅

작성한 질문수

[7일완성]생각하는 데이터베이스모델링

26_학사관리시스템(SQL실습3)

쿼리 질문드립니다!

해결된 질문

작성

·

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 성능 최적화에 관한 내용을 설명드리겠습니다. 조인과 서브쿼리 중 어떤 방법이 더 효율적인지는 데이터베이스의 구조, 인덱스 설정, 데이터의 크기에 따라 달라질 수 있습니다. 그러나 일반적으로, 조인을 사용하는 것이 더 효율적인 경우가 많습니다.

  1. 조인(JOIN) 사용:

    • 조인은 일반적으로 서브쿼리보다 성능이 더 좋은 것으로 알려져 있습니다. 데이터베이스는 조인을 효율적으로 처리하도록 설계되어 있기 때문입니다. 특히 컬럼에 적절한 인덱스가 설정되어 있을 경우, 조인으로 인한 성능 향상을 얻을 수 있습니다.
    • 예를 들어, student_coursestudent를 조인하여 student_name을 얻는 예제에서는 조인의 이점을 잘 활용할 수 있습니다.
  2. 서브쿼리 사용:

    • 서브쿼리는 독립적으로 실행될 수 있으며, 종종 보다 직관적인 방식으로 문제를 해결할 수 있습니다. 그러나 각 서브쿼리가 실행될 때마다 새롭게 데이터를 검색해야 하므로 데이터의 크기가 클 경우 성능 저하가 발생할 수 있습니다.
    • 예제에서 서브쿼리를 사용한 경우는, 특정 조건을 필터링하여 메인 쿼리에 전달하는 방식이지만, 규모가 큰 데이터베이스에서는 비효율적일 수 있습니다.

다음 게시글 또한 관련 질문에 대한 유용한 정보를 제공하고 있으니 참고하시기 바랍니다:
- DB 성능 최적화를 위한 효율적인 SQL 작성 요령

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

맛땅님의 프로필 이미지
맛땅

작성한 질문수

질문하기