서브쿼리와 공통 테이블 식(CTE)

PostgreSQL에서 쿼리 성능 개선하기

Amy McCarty

Instructor

서브쿼리 소개

무엇?

  • 조인의 대안
  • 단순한 쿼리

이유?

  • 단일 결과 반환 가능
  • 가독성 높음
  • 조인과 유사한 SQL 구문

방법?

  • SELECT, FROM, WHERE 절에서 사용
PostgreSQL에서 쿼리 성능 개선하기

SELECT 서브쿼리

row script_word word_length
1 goat 4
2 goat 4
3 dog 3
15,782 ... ...
row english_word word_length
1 goat 4
2 turkey 6
3 ant 3
171,476 ... ...
PostgreSQL에서 쿼리 성능 개선하기

SELECT 서브쿼리

SELECT AVG(word_length) AS avg_movie
  , (SELECT AVG(word_length) 
      FROM english_language) 
      AS avg_english
FROM MOVIE
avg_movie avg_english
3 4.5
PostgreSQL에서 쿼리 성능 개선하기

WHERE 서브쿼리

row script_word word_length
1 goat 4
2 goat 4
3 dog 3
15,782 ... ...
row english_word word_length
1 goat 4
2 turkey 6
3 ant 3
171,476 ... ...
PostgreSQL에서 쿼리 성능 개선하기

WHERE 서브쿼리

SELECT AVG(word_length) AS avg_movie
FROM english_language
WHERE word IN 
  (SELECT DISTINCT word FROM movie) 
avg_movie
3
PostgreSQL에서 쿼리 성능 개선하기

FROM 서브쿼리

SELECT AVG(word_length) AS avg_movie 
FROM (SELECT * FROM movie)

 

  • 가독성 저하
  • 쿼리 계획 유연성 제한
PostgreSQL에서 쿼리 성능 개선하기

공통 테이블 식(CTE) 소개

무엇?

  • 조인의 대안
  • 임시 결과를 가진 독립 쿼리

이유?

  • 단일 결과 반환 가능
  • 가독성 높음
  • 임시 테이블 생성

방법?

  • WITH 구문 사용
PostgreSQL에서 쿼리 성능 개선하기

CTE 구조

WITH english_cte AS
(    
  SELECT word_length
      , COUNT(word) AS english_word_count
    FROM english_language 
    GROUP BY word_length
)

SELECT movie.word_length , COUNT(movie.word) AS movie_word_count , cte.english_word_count FROM movie INNER JOIN english_cte cte ON movie.word_length = cte.word_length GROUP BY movie.word_length, cte.english_word_count
PostgreSQL에서 쿼리 성능 개선하기

Vamos praticar!

PostgreSQL에서 쿼리 성능 개선하기

Preparing Video For Download...