티스토리 뷰
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 엔진의 특성과 여러분의 데이터의 특성에 따라 달라진다.