2017-05-10 3 views
0

다음 쿼리간에 성능에 차이가 있습니까? 필터링 된 세트Postgresql : 필터 함수 출력 대 함수에 필터 매개 변수 전달

create function foo() returns setof table1 as 
$$ 
    select * from table1 
$$ language SQL; 

select * from foo() where name = 'bar' 

2 foo는() 파라미터를 받아 반환 :

create function foo(varchar) returns setof table1 as 
$$ 
    select * from table1 where name = $1 
$$ language SQL; 

select * from foo('bar') 

1. 푸() 여과 된 여과되지 않은 세트를 리턴 필자는 DB가 최종 쿼리를 계획하기 전에 기능을 "인라인 (inline)"하여 실행에 아무런 차이가 없도록 충분히 똑똑하다고 가정합니다. 그러나 나는 확실하지 않다.

답변

0

을 볼 수 있습니다.

인라인 될 함수에 대해 여러 조건이 충족되어야하며 전체 쿼리의 일부로 opmimized가됩니다. 이 Immutable 또는 Stable를 선언 않다면

문제의 함수

는 인라인 될 것입니다 : 함수가 테이블 조회를 수행하기 때문에

create function foo() returns setof table1 as 
$$ 
    select * from table1 
$$ language SQL stable; 

Stable이 더 적합합니다.

+0

select에서'explain analyse'는'stable'과 default 사이의 차이를 보여줍니다. – astreltsov

1
  1. 첫 번째 실행 매개 변수없이 (아마도 더 많은 데이터를 얻는) 다음 필드에 데이터를 필터링합니다. 그래서 아마도 더 많은 비용이들 것입니다.
  2. 두 번째 실행이
  3. 함수의 몸이없는 매개 변수 (함수 실행에 가능한 감소 데이터)와 함께 작동, 그것은 테이블에 몇 백만 (예 : 5) 행을 넣어 순수한 추측
+0

당신의 몸 기능을 가진 – astreltsov

+0

가 추가되었습니다. 당신이 믿을 때'사례가 필요합니다. '라고 생각합니다. –

+0

'return '문장을 추가하는 것을 잊었지만 작동합니다. – astreltsov

0

이며, 시도 열 name (예 : 'bar')에 대해 10-20 개의 다른 값을 사용하십시오. 그런 다음 인덱스가 create index iixx on table1(name)

그런 select count(*) from foo() where name = 'bar'

다음 두 번째 버전 select count(*) from foo1('bar')

를 시도 실행 추가하고 당신은 내가이 응답하는 wiki 페이지를 발견 차이