사용 사례 3 — SELECT 문의 함수 호출 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

사용 사례 3 — SELECT 문의 함수 호출

where절에서 함수를 호출하면 함수를 호출하는 동안 select 키워드를 사용하지 않고 함수를 호출할 때 쿼리 성능이 저하될 수 있습니다. VOLATILE

Select * from tab_name where FieldName = FunctionName(parameters);

함수를 호출하는 동안 해당 select 명령문을 사용하면 인덱스 스캔이 실행됩니다.

Select * from tab_name where FieldName = ( select FunctionName(parameters) );

pnr_number필드의 rnr_expiry_date 테이블 색인이 있습니다. 인덱스는 where 조항의 값을 비교할 때 사용됩니다.

explain analyze select * from perf_user.rnr_expiry_date where pnr_number= 'EE9F41'; "Index Scan using rnr_expiry_date_idx3 on rnr_expiry_date (cost=0.29..8.31 rows=1 width=72) (actual time=0.020..0.021 rows=1 loops=1)" " Index Cond: ((pnr_number)::text = 'EE9F41'::text)" "Planning Time: 0.063 ms" "Execution Time: 0.038 ms"

필드에 색인을 사용할 수 있는 경우에도 select 키워드 없이 함수를 호출하면 순차 스캔이 수행됩니다.

explain analyze select * from perf_user.rnr_expiry_date where pnr_number= perf_user.return_data(); "Seq Scan on rnr_expiry_date (cost=0.00..27084.00 rows=1 width=72) (actual time=0.112..135.917 rows=1 loops=1)" " Filter: ((pnr_number)::text = (perf_user.return_data())::text)" " Rows Removed by Filter: 99999" "Planning Time: 0.053 ms" "Execution Time: 136.803 ms"

select키워드와 함께 함수를 호출하면 인덱스 스캔이 수행됩니다.

explain analyze select * from perf_user.rnr_expiry_date where pnr_number= (select perf_user.return_data() ); "Index Scan using rnr_expiry_date_idx3 on rnr_expiry_date (cost=0.55..8.57 rows=1 width=72) (actual time=0.058..0.061 rows=1 loops=1)" " Index Cond: ((pnr_number)::text = ($0)::text)" " InitPlan 1 (returns $0)" " -> Result (cost=0.00..0.26 rows=1 width=32) (actual time=0.021..0.022 rows=1 loops=1)" "Planning Time: 0.147 ms" "Execution Time: 0.111 ms"