inflearn logo
강의

Course

Instructor

[7-day completion] Thinking database modeling

26_Academic Management System (SQL Practice 3)

쿼리 질문드립니다!

Resolved

150

dajfna

3 asked

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 = '가교수'));

 

dbms/rdbms ERD backend sql

Answer 2

0

bitcocom

문의 주신부분은 데이터베이스의 크기, 인덱스 설정 여부, 데이터 분포 등의 요인에 따라 차이가 발생할 수 있습니다. 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

dajfna

말씀 감사합니다!!

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 맛땅님.

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

  1. 조인(JOIN) 사용:

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

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

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

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

vercel실행 - failed to fetch

0

11

1

드랍 테이블로 지운 ordes에 대해서 질문

0

22

1

문제 풀이 1번 질문

0

28

1

데이터베이스 13번 문제

0

43

2

아주 작은 정오표 전달드립니다.

0

52

2

call stack 표현이 잘못표현된것이 아닌가요?

0

66

2

추천해주신 책에 대해 문의드립니다.

0

28

2

mysql워크벤치를 실행할때마다 오류가 뜹니다. 해결 방법좀 가르켜주세요.

0

44

1

온톨로지 구축

0

27

1

실제로 작은 기업에서 기획 롤

1

26

1

함수기반 인덱스

0

29

2

날짜 인덱스관련 질문

0

26

1

복합인덱스 확인법

0

23

0

전자책으로 구매인증 가능할까요?

0

72

1

order_product 까마귀발

0

44

2

공통 코드 , 계층 구조 질문

1

39

1

77번 문제

0

27

1

계산 로직을 Java 단이 아닌 쿼리문에서 하신 이유가 궁금합니다.

0

214

2

12_논리적인 모델링(독립형,상속형PK)에서 질문드립니다.

0

237

2

테이블정의서 NN(NotNull)

0

294

1

테이블 이름에 "t_" 프리픽스를 붙이는 이유가 있나요?

0

542

1

마프1탄은 언제개강예정인가요?

0

207

1

제품테이블에서 제품색상처리는/

0

223

1

intellij Ultimate tomcat server로 구동시 생긴문제입니다.

0

370

1