WHERE 절에서의 필터링

PostgreSQL에서 쿼리 성능 개선하기

Amy McCarty

Instructor

데이터 제한하기

Order Clause Purpose
1 FROM 테이블 지정
2 WHERE 레코드 필터/제한

 

  • 초기에 실행
  • 레코드 수 감소
PostgreSQL에서 쿼리 성능 개선하기

EXPLAIN

EXPLAIN
SELECT * FROM phones

 

Seq Scan on phones (cost = 0.00..22.7
                    ,rows=1270
                    ,width=36)
  • 실행 단계 수

쿼리 플래너

큰 냄비를 둘러싼 여러 요리사

PostgreSQL에서 쿼리 성능 개선하기

WHERE와 함께하는 EXPLAIN

EXPLAIN
SELECT * FROM phones
WHERE phone_code = 235

 

Seq Scan on phones (cost = 0.00..25.8
                    ,rows=6,width=636)
  Filter: (phone_code=235)

쿼리 플래너

큰 냄비를 둘러싼 여러 요리사

PostgreSQL에서 쿼리 성능 개선하기

좋음 - LIKE OR로 유사 값 필터링

country phone_code reliability
Chad 235 medium
China 86 high
Costa Rica 506 high
India 91 medium
Indonesia 62 medium
Iraq 964 low
EXPLAIN
SELECT * FROM phones
WHERE country LIKE 'Ch%' 
  OR country LIKE 'In%'

 

Seq Scan on phones (cost = 0.00..29.05
                    ,rows=13,width=36)
  Filter: ((country~~'Ch%'::text)
           OR(country~~'In%'::text))
PostgreSQL에서 쿼리 성능 개선하기

더 나음 - LIKE ANY로 유사 값 필터링

country phone_code reliability
Chad 235 medium
China 86 high
Costa Rica 506 high
India 91 medium
Indonesia 62 medium
Iraq 964 low
EXPLAIN
SELECT * FROM phones
WHERE country 
  LIKE ANY(ARRAY['Ch%','In%'])

 

Seq Scan on phones (cost = 0.00..25.88
                    ,rows=13,width=36)
  Filter: ((country~~ANY('{Ch%,In%}'
                          ::text[]))
PostgreSQL에서 쿼리 성능 개선하기

좋음 - OR로 정확한 값 필터링

country phone_code reliability
Chad 235 medium
China 86 high
Costa Rica 506 high
India 91 medium
Indonesia 62 medium
Iraq 964 low
EXPLAIN
SELECT * FROM phones
WHERE country = 'Chad' 
  OR country = 'China'

 

Seq Scan on phones (cost = 0.00..29.05
                    ,rows=13,width=36)
  Filter: ((country='Chad'::text)
           OR(country='China'::text))
PostgreSQL에서 쿼리 성능 개선하기

더 나음 - IN으로 정확한 값 필터링

country phone_code reliability
Chad 235 medium
China 86 high
Costa Rica 506 high
India 91 medium
Indonesia 62 medium
Iraq 964 low
EXPLAIN
SELECT * FROM phones
WHERE country IN ('Chad','China')

 

Seq Scan on phones (cost = 0.00..25.88
                    ,rows=13,width=36)
  Filter: ((country=ANY('{Chad,China}'
                          ::text[]))
PostgreSQL에서 쿼리 성능 개선하기

가장 좋음 - 숫자 필터링

country phone_code reliability
Chad 235 medium
China 86 high
Costa Rica 506 high
India 91 medium
Indonesia 62 medium
Iraq 964 low
EXPLAIN
SELECT *
FROM phones
WHERE phone_code IN (235,86) 

 

Seq Scan on phones (cost = 0.00..25.88
                    ,rows=13,width=36)
  Filter: (phone_code=ANY('{235,86}'
                          ::integer[]))
PostgreSQL에서 쿼리 성능 개선하기

최적의 WHERE 필터 요약

 

숫자형의 이점

  • 더 짧은 길이
  • 더 작은 저장 공간
  • 성능 향상
PostgreSQL에서 쿼리 성능 개선하기

최적의 WHERE 필터 요약

 

숫자형의 이점

  • 더 짧은 길이
  • 더 작은 저장 공간
  • 성능 향상

 

Good Better
텍스트 숫자
OR IN, ARRAY
PostgreSQL에서 쿼리 성능 개선하기

Ayo berlatih!

PostgreSQL에서 쿼리 성능 개선하기

Preparing Video For Download...