PostgreSQL 절차 언어-PL / pgSQL과 SQL의 차이점


20

누구든지 다음의 차이점을 요약 해 주시겠습니까?

http://www.postgresql.org/docs/9.1/static/xfunc-sql.html

http://www.postgresql.org/docs/9.1/static/plpgsql.html

?

중요 점:

  • 개념상의 차이
  • 문제가있는 가족, 사용 편의성
  • 정치적 이슈

1
첫째, SQL (일명 쿼리 언어) 함수에는 PostgreSQL 절차 언어가 포함되지 않습니다. 둘째, 당신은 이미 귀하의 질문에 대한 답변을 찾을 수있는 최고의 소스 발견했습니다 (마지막 하나를 제외하고 - 정확히 '정치적 문제'로 youmean 무엇을)
dezso

필자는 붙여 넣은 문서를 사용할 필요는 없지만 개인적인 인상을 사용하여 모든 주요 문제 를 요약 하도록 요청했습니다 . 이러한 링크는 모든 사람이 질문에 대한 내용을 이해하도록하기위한 것입니다.
Gismo Ranas

그것을 폭행으로 생각하지 말고 일단 읽은 후에는 직접 요약 할 수 있습니다 :) 그렇지 않으면 질문이 약간 광범위하지만 약간의 시간이 주어지면 몇 가지 생각을 모 으려고 노력할 것입니다.
dezso

1
다른 절차 적 언어를 무시하지 마십시오. 특히 PL / Perl은 PL / PgSQL이 너무 제한된 영역에 매우 유용합니다. PL / Pythonu는 Python을 선호하지만 PL / Perl과 같은 보안 모델을 제공하지 않으면 작동합니다. 추가 기능으로 PL / V8 (JavaScript)도 있습니다.
Craig Ringer

1
안녕하세요 cataldo-여기에 첫 번째 질문이 있기 때문에 사이트에 오신 것을 환영합니다. 게시 해 주셔서 감사합니다.
잭 더글러스

답변:


27

PL / PgSQL 및 일반 SQL 함수는 모두 더 큰 도구 세트의 일부이므로 해당 컨텍스트에서 확인해야합니다. 나는 복잡성과 비용의 상승에 따른 오름차순 규모의 힘으로 생각하는 경향이 있습니다. 여기서 작업을 잘 수행하는 가장 간단한 도구를 사용해야합니다.

  • 가능하면 뷰를 사용하십시오.
  • 보기가 적합하지 않은 경우 SQL 함수를 사용하십시오.
  • SQL 함수가 적합하지 않은 경우 PL / PgSQL을 사용하십시오.
  • PL / PgSQL이 너무 제한적이거나 표현력이 충분하지 않은 경우 PL / Perl, PL / Python, PL / V8, PL / Java 또는 원하는 환경 설정을 사용하십시오.
  • ... PL이 작업을 수행하지 않는 경우 외부 프로그램을 사용하십시오. LISTEN 하고NOTIFY 그것을 얘기.

함수가 필요하다고 생각할 때 뷰가 충분하는 경우가 많습니다. 그것이 매우 비싸더라도SELECT전체 뷰에 뷰를 WHERE참조하는 쿼리의 절은 일반적으로 뷰로 푸시되어 쿼리 계획이 매우 다를 수 있습니다. SQL 함수를 뷰로 변환하여 성능이 크게 향상되었습니다.

뷰를 사용할 수 없으며 SQL 함수를 고려해야 할 주요 시점은 다음과 같습니다.

  • 단순하게 표현할 수없는 매개 변수 WHERE 절로 매개 변수 (예 : WITH표현식 내의 매개 변수)
  • 당신은 보안 장벽을 통해 SECURITY DEFINER함수security_barrier PostgreSQL 9.2 이상의 보기로는 충분하지 않습니다.
  • 옵티마이 저가 뷰의 하위 절로 푸시하지 않는 매개 변수가 필요하며 더 직접 제어하려고합니다. 또는
  • 많은 매개 변수가 있거나 매개 변수의 반복이 많으므로 조회를보기로 작성하는 것은 비현실적입니다.

이러한 대부분의 작업에서 일반 SQL 함수는 정상적으로 작동하며 PL / PgSQL보다 읽기 쉽습니다. 선언 된 ( STABLE또는 선언 IMMUTABLE되지 않은 STRICT또는 SECURITY DEFINER) SQL 함수 도 호출 문에 인라인 될 수 있습니다. 이로 인해 함수 호출 오버 헤드가 제거되고 호출 함수의 WHERE 조건이 옵티 마이저에 의해 SQL 함수로 푸시 다운 될 때 성능이 크게 향상 될 수 있습니다. 작업에 충분할 때마다 SQL 함수를 사용하십시오.

SQL 함수가 작업을 수행하지 않는 주요 시간은 많은 로직이 필요할 때입니다. CASE명령문으로 표현할 수없는 다른 연산 , 계산 된 결과의 많은 재사용, 청크로부터 값 생성, 오류 처리 등 PL / PgSQL이 편리합니다. SQL 함수를 사용할 수 없거나 다음과 같이 적합하지 않은 경우 PL / PgSQL을 선택하십시오.

  • EXECUTE명령문을 통한 동적 SQL 및 동적 DDL
  • RAISE로그 또는 클라이언트에 대한 오류 / 경고를 원할 때
  • 예외 처리가 필요한 경우 다음을 사용하여 오류를 포착하고 처리 할 수 ​​있습니다. EXCEPTION 전체 트랜잭션을 오류로 종료하지 않고 블록으로
  • 적합하지 않은 복잡한 조건부 논리 CASE ... WHEN
  • 맞출 수없는 계산 된 값을 많이 재사용 WITH 과 CTE를
  • 동적 레코드 작성
  • 결과 집합 생성 한 작업을 수행해야합니다.

CTE (공통 테이블 표현식), 특히 쓰기 가능한 CTE를 WITH RECURSIVE사용하면 SQL이 훨씬 표현적이고 강력하기 때문에 PL / PgSQL을 사용하는 것보다 훨씬 적게 사용합니다. 뷰와 일반 SQL 함수를 훨씬 더 많이 사용합니다. 일반 SQL 함수는 둘 이상의 명령문을 포함 할 수 있음을 기억해야합니다. 마지막 문장은 함수의 결과입니다.


잘 말했다! (쓰기 가능한 CTE를 언급하기 위해 가상 +1이지만 추가)
dezso

이것은 또한 어떤 함수가 최적화 펜스가 필요한 이유를 설명합니다 .
Eonil

8

plpgsql변수, 루핑 구문 등을 포함한 본격적인 절차 언어 SQL입니다. 함수는 단순히 하위 쿼리입니다. 선언 STABLE되거나 선언 IMMUTABLE되지 않은 SQL 함수는 마치 각 참조에서 작성된 것처럼 호출 쿼리에 인라인STRICT 될 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.