하나의 쿼리를 만들어서 실행하면 13ms밖에 시간이 안걸리는데,
그쿼리를 function으로 묶고, 매개변수값을주어 where을 처리하면 주면 1,670ms가 나옵니다.
쿼리만 빼내서 그 매개변수값 그대로 넣고 실행하면 10ms정도로 빨라지고요..
무슨 이유가 있나요? 해결방법은요?
그냥 쿼리일때 그 실행계획과 함수 일때의 실행계획이 달라서 그렇겠죠.
단순시 몇배 정도 나면, 함수 처리 비용이라고 할터인데,
거의 백배 정도 나면, 실행계획 차이입니다.
답변감사합니다.
함수비용, 실행계획? 좀 생소한데요,
단순쿼리가 union 으로 4개가 묶여있는데,
그 차이구분을 어떻게 알아내고,
실행계획 차이라면 어떻게 수정을 해줘야할까요?
만드신 함수나 데이터를 예시로 올려주시면 답변에 더 도움이 될듯합니다.
함수 끝에 language sql인가요? plpgsql인가요?
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'
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'
From t_ins_doksusil where mid=$1 and stu_c=$2 And somyal<>'Y'
)d;
LANGUAGE sql VOLATILE
COST 100;
ALTER FUNCTION fc_point_jan(character varying, numeric)
OWNER TO postgres;
안에 쿼리만 빼서 조회하면 빠른데,
같은 조건으로 함수로하면 많이 느려집니다.