database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 9721 게시물 읽기
No. 9721
똑같은 쿼리를 function으로 만들면 느려지는 이유가 뭔가요?
작성자
이기자(k3i2)
작성일
2016-10-14 16:41
조회수
7,908

하나의 쿼리를 만들어서 실행하면 13ms밖에 시간이 안걸리는데,

그쿼리를 function으로 묶고, 매개변수값을주어 where을 처리하면 주면 1,670ms가 나옵니다.

쿼리만 빼내서 그 매개변수값 그대로 넣고 실행하면 10ms정도로 빨라지고요..

무슨 이유가 있나요? 해결방법은요?

 

이 글에 대한 댓글이 총 5건 있습니다.

그냥 쿼리일때 그 실행계획과 함수 일때의 실행계획이 달라서 그렇겠죠.

단순시 몇배 정도 나면, 함수 처리 비용이라고 할터인데,

거의 백배 정도 나면, 실행계획 차이입니다.

김상기(ioseph)님이 2016-10-15 01:01에 작성한 댓글입니다.

답변감사합니다.

함수비용, 실행계획? 좀 생소한데요,

단순쿼리가 union 으로 4개가 묶여있는데,

그 차이구분을 어떻게 알아내고,

실행계획 차이라면 어떻게 수정을 해줘야할까요?

이기자(k3i2)님이 2016-10-17 10:38에 작성한 댓글입니다.

만드신 함수나 데이터를 예시로 올려주시면 답변에 더 도움이 될듯합니다.

김주왕(kimjuking)님이 2016-10-17 13:02에 작성한 댓글입니다.

함수 끝에 language sql인가요? plpgsql인가요?

지현명(gwise)님이 2016-10-17 17:52에 작성한 댓글입니다.

CREATE OR REPLACE FUNCTION fc_point_jan(character varying, numeric)

RETURNS numeric AS

$BODY$

select sum( d.geum + d.geum_subj )as geum

from(

Select ( Case io_gubun When 'I'Then Case Coalesce(jeunggam,'N') When 'Y' Then geum Else 0 End Else 0 End +

Case io_gubun When 'I' Then Case Coalesce(yb,'') When '' Then 0 Else Case Coalesce(jeunggam,'N') When 'Y' Then 0 Else geum End End Else 0 End +

Case io_gubun When 'I'Then Case kind When 'C' Then geum When 'CSJ' Then geum When 'CSB' Then geum When '9M' Then geum Else 0 End Else Case io_gubun When 'O' Then 0 When 'Y' Then 0 Else geum End End ) As geum,

( Case io_gubun When 'O'Then geum Else 0 End +

Case io_gubun When 'O'Then 0 Else Case io_gubun When 'B'Then geum When 'Y'Then geum Else 0 End End ) As geum_subj

From t_point where mid=$1 and stu_c=$2 and coalesce(cancel,'N')<>'Y' And somyal<>'Y'

 

Union All

 

Select 0 as geum, 0 - coalesce(sum(ib_eungsiryo),0)as geum_subj

From t_mo_gosa_jupsu where mid=$1 and stu_c=$2 and ib_type = '4' and coalesce(cancel,'N')<>'Y' And somyal<>'Y'

 

Union All

 

Select 0 as geum, 0 - coalesce(sum(point),0)as geum_subj

From t_doksusil where mid=$1 and stu_c=$2 And somyal<>'Y'

 

Union All

 

Select 0 as geum, 0 - coalesce(sum(point),0)as geum_subj

From t_ins_doksusil where mid=$1 and stu_c=$2 And somyal<>'Y'

)d;

$BODY$

LANGUAGE sql VOLATILE

COST 100;

ALTER FUNCTION fc_point_jan(character varying, numeric)

OWNER TO postgres;

 

 

안에 쿼리만 빼서 조회하면 빠른데,

같은 조건으로 함수로하면 많이 느려집니다.

이기자(k3i2)님이 2016-10-21 11:03에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
9724[postgresql]비밀번호 정책관련 [2]
김홍열
2016-10-24
9214
9723세션 정보 API [3]
고은진
2016-10-19
7795
9722.NET과 MSDTC 지원 여부 [1]
주지후
2016-10-18
7673
9721똑같은 쿼리를 function으로 만들면 느려지는 이유가 뭔가요? [5]
이기자
2016-10-14
7908
9720postgresql 관련 문의 [1]
탁구공
2016-10-12
7739
9719pgadmin 질문이요 edit data 창 수정 [3]
천구
2016-10-12
7822
9718DB 접속 불가 문제 도와주세요ㅠㅠ [1]
검콤이
2016-10-10
7596
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다