57.4. 외부 데이터 래퍼 쿼리 토토 캔

FDW 콜백 함수GetForeignRelSize, GetForeignPaths, GetForeignPlan, PlanForeign수정, GetForeignJoinPaths, GetForeignUpperPaths그리고PlanDirectModify의 작업에 적합해야 합니다포스트그레SQL플래너. 다음은 그들이 해야 할 일에 대한 몇 가지 참고 사항입니다.

정보루트그리고바셀외부 테이블에서 가져와야 하는 정보의 양을 줄이는 데 사용할 수 있습니다(따라서 비용을 절감).baserel-baserestrictinfo제한 한정어()가 포함되어 있어 특히 흥미롭습니다.어디절)은 가져올 행을 필터링하는 데 사용해야 합니다. (핵심 실행자가 대신 확인할 수 있으므로 FDW 자체는 이러한 자격을 시행할 필요가 없습니다.)baserel-reltarget-exprs가져와야 할 열을 결정하는 데 사용할 수 있습니다. 하지만 여기에는 다음에서 내보내야 하는 열만 나열됩니다.ForeignScan토토 캔 노드, 품질 평가에 사용되지만 쿼리로 출력되지 않는 열이 아닙니다.

FDW 계획 기능에서 정보를 보관하기 위해 다양한 비공개 필드를 사용할 수 있습니다. 일반적으로 FDW 비공개 필드에 저장한 모든 항목은 계획이 끝나면 회수될 수 있도록 palloc되어야 합니다.

baserel-fdw_private무효특정 외부 테이블과 관련된 정보를 저장하기 위해 FDW 계획 기능에 사용할 수 있는 포인터입니다. 코어 플래너는 다음과 같은 경우 NULL로 초기화하는 것을 제외하고는 이를 건드리지 않습니다.RelOptInfo노드가 생성되었습니다. 다음에서 정보를 전달하는 데 유용합니다.GetForeignRelSizeGetForeignPaths및/또는GetForeignPathsGetForeignPlan, 재계산을 방지합니다.

GetForeignPaths개인 정보를 저장하여 다양한 액세스 경로의 의미를 식별할 수 있습니다.fdw_private필드ForeignPath노드.fdw_private다음으로 선언되었습니다.목록포인터이지만 코어 플래너가 포인터를 건드리지 않기 때문에 실제로는 무엇이든 포함될 수 있습니다. 그러나 가장 좋은 방법은 다음으로 덤프할 수 있는 표현을 사용하는 것입니다.nodeToString, 백엔드에서 사용 가능한 디버깅 지원과 함께 사용됩니다.

GetForeignPlan검토할 수 있습니다fdw_private선택된 필드ForeignPath노드, 생성 가능fdw_exprs그리고fdw_private에 배치될 목록ForeignScan실행 시 사용할 수 있는 계획 노드입니다. 이 두 목록은 모두 다음 형식으로 표시되어야 합니다.copyObject복사하는 방법을 알고 있습니다.fdw_private목록에는 다른 제한이 없으며 어떤 방식으로든 핵심 백엔드에 의해 해석되지 않습니다.fdw_exprs목록은 NIL이 아닌 경우 런타임에 실행될 표현식 트리를 포함할 것으로 예상됩니다. 이 트리는 완전히 실행 가능하게 만들기 위해 플래너에 의해 사후 처리를 거칩니다.

GetForeignPlan, 일반적으로 전달된 대상 목록을 그대로 계획 노드에 복사할 수 있습니다. 합격scan_clauses목록에는 다음과 동일한 절이 포함되어 있습니다.baserel-baserestrictinfo, 그러나 더 나은 실행 효율성을 위해 재정렬될 수 있습니다. 간단한 경우에는 FDW가 제거될 수 있습니다.RestrictInfo으로부터의 노드scan_clauses목록(사용extract_actual_clauses) 그리고 모든 조항을 계획 노드의 품질 목록에 넣습니다. 이는 런타임 시 실행 프로그램이 모든 조항을 확인한다는 의미입니다. 더 복잡한 FDW는 일부 조항을 내부적으로 확인할 수 있으며, 이 경우 해당 조항은 실행자가 다시 확인하는 데 시간을 낭비하지 않도록 계획 노드의 자격 목록에서 해당 조항을 제거할 수 있습니다.

예를 들어, FDW는 다음 형식의 일부 제한 조항을 식별할 수 있습니다.외국_변수 = 하위 표현, 이는 로컬에서 평가된 값을 바탕으로 원격 서버에서 실행될 수 있다고 판단합니다.하위 표현. 그러한 조항의 실제 식별은GetForeignPaths, 경로의 예상 비용에 영향을 미치기 때문입니다. 경로는fdw_private필드에는 식별된 절에 대한 포인터가 포함될 것입니다.RestrictInfo노드. 그런 다음GetForeignPlan다음에서 해당 조항을 제거하겠습니다scan_clauses, 하지만 다음을 추가하세요.하위 표현fdw_exprs실행 가능한 형식으로 변환되도록 합니다. 아마도 계획 노드에 제어 정보를 넣을 수도 있습니다.fdw_private실행 함수에 런타임에 수행할 작업을 알려주는 필드입니다. 원격 서버로 전송되는 쿼리에는 다음과 같은 내용이 포함됩니다.어디외국_변수 = $1, 런타임 시 평가를 통해 얻은 매개변수 값 포함)fdw_exprs표현 트리.

계획 노드의 자격 목록에서 제거된 모든 조항은 대신에 추가되어야 합니다.fdw_recheck_quals또는 다음에 의해 다시 확인됨RecheckForeignScan올바른 동작을 보장하기 위해읽어 커밋됨격리 수준. 쿼리와 관련된 다른 테이블에 대해 동시 업데이트가 발생하면 실행 프로그램은 다른 매개변수 값 집합에 대해 튜플에 대한 모든 원래 자격이 여전히 충족되는지 확인해야 할 수 있습니다. 사용fdw_recheck_quals일반적으로 내부 검사를 구현하는 것보다 쉽습니다RecheckForeignScan, 그러나 외부 조인이 푸시다운된 경우 이 방법은 충분하지 않습니다. 이 경우 조인 튜플은 튜플을 완전히 거부하지 않고 일부 필드가 NULL이 될 수 있기 때문입니다.

또 다른ForeignScanFDW로 채울 수 있는 필드는fdw_scan_tlist: 이 계획 노드에 대해 FDW에서 반환한 튜플을 설명합니다. 간단한 외부 테이블 스캔의 경우 다음과 같이 설정할 수 있습니다.NIL, 이는 반환된 튜플에 외부 테이블에 대해 선언된 행 유형이 있음을 의미합니다. 비-NIL값은 대상 목록(list of이어야 합니다.대상 항목16441_16774fdw_scan_tlist. 조인 계획(다음에 의해 만들어진 경로에서 생성됨)에 유의하세요.GetForeignJoinPaths)는 항상 제공해야 합니다.fdw_scan_tlist반환할 열 집합을 설명합니다.

FDW는 항상 테이블의 제한 조항에만 의존하는 경로를 하나 이상 구성해야 합니다. 조인 쿼리에서는 조인 절에 의존하는 경로를 구성하도록 선택할 수도 있습니다. 예를 들어외국_변수 = local_variable. 그러한 조항은 다음에서 찾을 수 없습니다.baserel-baserestrictinfo그러나 관계의 조인 목록에서 검색되어야 합니다. 이러한 절을 사용하는 경로를 a라고 합니다.매개변수화된 경로. 선택한 조인 절에 사용된 다른 관계를 적절한 값으로 식별해야 합니다.param_info; 사용get_baserel_parampathinfo그 값을 계산합니다. 에서GetForeignPlan, 그local_variable조인 절의 일부가 다음에 추가됩니다.fdw_exprs, 런타임 시 이 사례는 일반 제한 조항과 동일하게 작동합니다.

FDW가 원격 조인을 지원하는 경우,GetForeignJoinPaths생산해야 한다ForeignPaths는 다음과 거의 같은 방식으로 잠재적인 원격 조인을 위한 것입니다.GetForeignPaths기본 테이블에서 작동합니다. 의도한 조인에 대한 정보는 다음으로 전달될 수 있습니다.GetForeignPlan위에서 설명한 것과 같은 방식입니다. 그러나baserestrictinfo조인 관계와 관련이 없습니다. 대신 특정 조인에 대한 관련 조인 절이 전달됩니다.GetForeignJoinPaths별도의 매개변수(추가-제한 목록).

FDW는 그룹화 또는 집계와 같은 검색 및 조인 수준보다 높은 일부 계획 작업의 직접 실행을 추가로 지원할 수 있습니다. 이러한 옵션을 제공하려면 FDW는 경로를 생성하고 이를 적절한 경로에 삽입해야 합니다.상위 관계. 예를 들어 원격 집계를 나타내는 경로는UPPERREL_GROUP_AGG관계, 사용add_path. 이 경로는 외부 관계에 대한 단순 스캔 경로를 읽어 수행되는 로컬 집계와 비용 기준으로 비교됩니다(이러한 경로도 제공해야 하며 그렇지 않으면 계획 시 오류가 발생합니다). 일반적으로 원격 집계 경로가 승리하는 경우 다음을 호출하여 일반적인 방식으로 계획으로 변환됩니다.GetForeignPlan. 이러한 경로를 생성하는 데 권장되는 위치는GetForeignUpperPaths쿼리의 모든 기본 관계가 동일한 FDW에서 나온 경우 각 상위 관계(즉, 각 사후 스캔/조인 처리 단계)에 대해 호출되는 콜백 함수.

PlanForeign수정및 다음에 설명된 기타 콜백섹션 57.2.4외부 관계가 일반적인 방식으로 스캔되고 개별 행 업데이트가 로컬에 의해 구동된다는 가정을 중심으로 설계되었습니다.테이블 수정계획 노드. 이 접근 방식은 업데이트 시 로컬 테이블과 외부 테이블을 모두 읽어야 하는 일반적인 경우에 필요합니다. 그러나 작업이 외부 서버에 의해 완전히 실행될 수 있는 경우 FDW는 이를 나타내는 경로를 생성하여UPPERREL_FINAL상위 관계, 여기서는 다음과 경쟁하게 됩니다.테이블 수정접근. 이 접근 방식은 원격 구현에도 사용될 수 있습니다.업데이트를 위해 선택, 설명된 행 잠금 콜백을 사용하는 대신섹션 57.2.6. 삽입된 경로는UPPERREL_FINAL구현을 담당합니다.모두쿼리의 동작.

토토 캔할 때업데이트또는삭제, PlanForeign수정그리고PlanDirectModify다음을 검색할 수 있습니다RelOptInfo외부 테이블을 구조체로 만들고 다음을 활용하세요.baserel-fdw_private스캔 계획 기능으로 이전에 생성된 데이터입니다. 그러나삽입대상 테이블이 스캔되지 않았으므로 없습니다RelOptInfo그렇습니다.목록반환자PlanForeign수정다음과 동일한 제한사항이 있습니다.fdw_privatea의 목록ForeignScan계획 노드, 즉 다음과 같은 구조만 포함해야 합니다.copyObject복사하는 방법을 알고 있습니다.

삽입그리고충돌 중절은 충돌 대상 지정을 지원하지 않습니다. 원격 테이블에 대한 고유 제약 조건이나 제외 제약 조건이 로컬로 알려져 있지 않기 때문입니다. 이는 차례로 다음을 의미합니다.충돌 시 업데이트를 하세요지정이 필수이므로 지원되지 않습니다.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.