inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

쿼리 질문드립니다!

해결된 질문

142

맛땅

작성한 질문수 2

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

답변 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

맛땅

말씀 감사합니다!!

0

인프런 AI 인턴

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

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

  1. 조인(JOIN) 사용:

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

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

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

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

노션 링크도 안 열리고, 알려준 vercel도 실행이 안됩니다.

0

7

1

3강 질문

0

15

1

Substack 1년 제공

1

21

3

특별 학습 자료 프로모션 1년 멤버십 무료 제공 문의드립니다

0

27

2

코드를 첨부해야하는 이유가 있나요?

0

20

2

강의 듣는 중인데,

0

23

1

36강 오탈자가 있는 거 같습니다.

0

20

2

Service Create/Update Record 운용과 Delete Record 미운용의 차이 질문

0

18

1

간단한 오타 제보입니다.

0

19

1

2강 nodejs 3단계 설명 질문

0

33

1

큰 범위 조회 시 EXPLAIN의 rows 값이 정확하지 않은 이유가 궁금합니다.

0

34

2

실제 FK제약조건을 설정하지 않는이유

0

35

2

Sequence 관련 질문

1

32

2

Image Only Query

1

29

2

Free Edition 실습 영상은 아직 업데이트전인가요?

0

22

1

라이브 운영중인 환경의 테이블에 인덱스 추가시 고려사항

0

36

2

상품 정보 크롤링

0

29

2

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

0

200

2

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

0

229

2

테이블정의서 NN(NotNull)

0

288

1

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

0

531

1

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

0

200

1

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

0

217

1

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

0

362

1