티스토리 뷰

반응형

https://ko.khanacademy.org/computing/computer-programming/sql/relational-queries-in-sql/pt/combining-multiple-joins

 

project_pairs2 행
id (PK)INTEGER
project1_idINTEGER
project2_idINTEGER

 

project pairs는 integer로 이루어져 있어서 사람이 유효하게 읽을 수 없다.

짝지어진 타이틀의 두 행을 보고 싶다.

 

그러면 프로젝트의 이름은 student_projects 테이블에 있고, student id는 student 테이블과 연결되어 있다.

즉, project_pair을 student_projects와 연결해야 한다.

 

일단 project_pairs를 student_projects와 cross join 해보자.

 

SELECT * FROM project_pairs JOIN student_projects
id	p1_id	p2_id	id	stu_id	title
1	1	2	1	1	Carrotapault
1	1	2	2	2	Mad Hattery
1	1	2	3	3	Carpet Physics
1	1	2	4	4	Hyena Habitats
2	3	4	1	1	Carrotapault
2	3	4	2	2	Mad Hattery
2	3	4	3	3	Carpet Physics
2	3	4	4	4	Hyena Habitats

 

그런데 문제는 프로젝트마다 보이게 하고 싶은 것이었다.

여기서 student_projects를 SELF JOIN 하여 같은 열의 값을 두번 가져올 수 있게 된다.

 

JOIN을 한 번 더하기 위해서는 그냥 JOIN을 추가하면 된다.

SELECT a.title,b.title FROM project_pairs
	JOIN student_projects a
    JOIN sutdent_projects b
title	title
Carrotapault	Carrotapault
Carrotapault	Mad Hattery
Carrotapault	Carpet Physics
Carrotapault	Hyena Habitats
Mad Hattery	Carrotapault
Mad Hattery	Mad Hattery
Mad Hattery	Carpet Physics
Mad Hattery	Hyena Habitats
Carpet Physics	Carrotapault
Carpet Physics	Mad Hattery
Carpet Physics	Carpet Physics
Carpet Physics	Hyena Habitats
Hyena Habitats	Carrotapault
Hyena Habitats	Mad Hattery
Hyena Habitats	Carpet Physics
Hyena Habitats	Hyena Habitats
Carrotapault	Carrotapault
Carrotapault	Mad Hattery
Carrotapault	Carpet Physics
Carrotapault	Hyena Habitats
Mad Hattery	Carrotapault
Mad Hattery	Mad Hattery
Mad Hattery	Carpet Physics
Mad Hattery	Hyena Habitats
Carpet Physics	Carrotapault
Carpet Physics	Mad Hattery
Carpet Physics	Carpet Physics
Carpet Physics	Hyena Habitats
Hyena Habitats	Carrotapault
Hyena Habitats	Mad Hattery
Hyena Habitats	Carpet Physics
Hyena Habitats	Hyena Habitats

그러면 project pair 마다 두 번씩 불러온다.(아래에 같은 테이블이 또 생김)

 

그런데 행이 너무 많다. 그래서 ON을 활용해서, project_pairs의 project1_id를 a.id와 결합시키고,

project_pairs의 project2_id를 b.id와 결합시킨다.

SELECT a.title, b.title FROM project_pairs
    JOIN student_projects a
    ON project_pairs.project1_id = a.id
    JOIN student_projects b
    ON project_pairs.project2_id = b.id;

 

그러면, project_pair가 가진 진짜 이름을 볼 수 있게 된다.

title	title
Carrotapault	Mad Hattery
Carpet Physics	Hyena Habitats

 

 

JOIN은 편리하나, 많으면 많을수록 속도가 느려진다.

 

따라서, 쿼리를 효율적으로 이용하기 위해서는 계획(PLAN)이 필요하다.

데이터가 커질 수록 풀 테이블 스캔보다는, index 스캔이 훨씬 빠르다.

 

쿼리 파서, 쿼리 플래너와 옵티마이저, 쿼리 실행기 순서로 진행되는 쿼리문.

쿼리 튜닝이 필요하다.

 

첫 번째 단계는 SQL 프로파일러 같은 것을 통해 데이터베이스 호출 중 가장 오래 걸리는 것을 찾거나 가장 많은 자원을 사용하는 것을 찾아서 튜닝하고 싶은 쿼리를 구분.

 

다음 단계는 특정 SQL 엔진이 쿼리를 실행하는 방법을 이해하는 것.

 

이제 수동으로 실행 플랜을 최적화하는, 어려운 부분이 시작. 이 부분은 종종 SQL 엔진의 특성과 여러분의 데이터의 특성에 따라 달라진다.

반응형