58.5. 외부 데이터 래퍼의 행 배트맨 토토#

FDW의 기본 저장 메커니즘에 해당 행의 동시 업데이트를 방지하기 위해 개별 행을 잠그는 개념이 있는 경우 일반적으로 FDW가 일반적으로 사용되는 의미론에 최대한 가까운 근사치로 행 수준 배트맨 토토을 수행하는 것이 좋습니다.포스트그레SQL테이블. 이와 관련하여 여러 가지 고려 사항이 있습니다.

중요한 결정 중 하나는 수행 여부입니다.조기 배트맨 토토또는늦은 배트맨 토토. 초기 잠금에서는 행이 기본 저장소에서 처음 검색될 때 잠기는 반면, 후기 잠금에서는 행을 잠가야 한다고 알려진 경우에만 잠깁니다. (로컬 검사 제한 또는 조인 조건에 따라 일부 행이 삭제될 수 있기 때문에 차이가 발생합니다.) 조기 배트맨 토토은 훨씬 간단하고 원격 저장소로의 추가 왕복을 방지하지만 잠길 필요가 없는 행이 잠길 수 있어 동시성이 줄어들거나 심지어 예상치 못한 교착 상태가 발생할 수도 있습니다. 또한 지연 잠금은 잠길 행을 나중에 고유하게 다시 식별할 수 있는 경우에만 가능합니다. 바람직하게는 행 식별자는 다음과 같이 행의 특정 버전을 식별해야 합니다.포스트그레SQLTID가 그렇습니다.

기본적으로,포스트그레SQLFDW에 인터페이스할 때 잠금 고려 사항을 무시하지만 FDW는 핵심 코드의 명시적인 지원 없이 조기 배트맨 토토을 수행할 수 있습니다. 설명된 API 함수는섹션 58.2.6, 다음에 추가됨포스트그레SQL9.5, 원하는 경우 FDW가 지연 잠금을 사용하도록 허용합니다.

추가 고려사항은 다음과 같습니다.읽어 커밋됨격리 모드,포스트그레SQL일부 대상 튜플의 업데이트된 버전에 대해 제한 및 조인 조건을 다시 확인해야 할 수도 있습니다. 조인 조건을 다시 확인하려면 이전에 대상 튜플에 조인된 비대상 행의 복사본을 다시 가져와야 합니다. 표준으로 작업할 때PostgreSQL테이블의 경우, 이는 조인을 통해 예상된 열 목록에 비대상 테이블의 TID를 포함시킨 다음 필요할 때 비대상 행을 다시 가져오는 방식으로 수행됩니다. 이 접근 방식은 조인 데이터 세트를 간결하게 유지하지만 저렴한 다시 가져오기 기능과 다시 가져올 행 버전을 고유하게 식별할 수 있는 TID가 필요합니다. 따라서 기본적으로 외부 테이블에 사용되는 접근 방식은 조인을 통해 예상되는 열 목록에 외부 테이블에서 가져온 전체 행의 복사본을 포함하는 것입니다. 이로 인해 FDW에 특별한 요구 사항은 없지만 병합 및 해시 조인 성능이 저하될 수 있습니다. 다시 가져오기 요구 사항을 충족할 수 있는 FDW는 첫 번째 방법을 선택할 수 있습니다.

다음을 위해업데이트또는삭제외국 테이블에서는 다음을 수행하는 것이 좋습니다.ForeignScan대상 테이블에 대한 작업은 아마도 다음과 같은 방법을 통해 가져오는 행에 대한 조기 배트맨 토토을 수행합니다.업데이트를 위해 선택. FDW는 테이블이 다음과 같은지 여부를 감지할 수 있습니다.업데이트/삭제Relid를 다음과 비교하여 계획 시 목표로 삼습니다.루트-분석-resultRelation또는 실행 시 다음을 사용하여ExecRelationIsTargetRelation(). 또 다른 가능성은 내에서 지연 배트맨 토토을 수행하는 것입니다.ExecForeignUpdate또는ExecForeignDelete콜백이지만 이에 대한 특별한 지원은 제공되지 않습니다.

다음에 의해 잠기도록 지정된 외부 테이블의 경우업데이트/공유 선택명령, 그ForeignScan작업은 다음과 동등한 튜플을 가져와서 조기 배트맨 토토을 다시 수행할 수 있습니다.업데이트/공유 선택. 대신 지연 잠금을 수행하려면 다음에 정의된 콜백 함수를 제공하세요.섹션 58.2.6. 에서GetForeignRowMarkType, 행 표시 옵션 선택ROW_MARK_EXCLUSIVE, ROW_MARK_NOKEYEXCLUSIVE, ROW_MARK_SHARE, 또는ROW_MARK_KEYSHARE요청된 잠금 강도에 따라 다릅니다. (핵심 코드는 선택한 네 가지 옵션에 관계없이 동일하게 작동합니다.) 다른 곳에서는 다음을 사용하여 이러한 유형의 명령으로 외부 테이블이 잠기도록 지정되었는지 여부를 감지할 수 있습니다.get_plan_rowmark계획 시간에 또는ExecFindRowMark실행 시; null이 아닌 rowmark 구조체가 반환되는지 여부뿐만 아니라 해당필드가 아님LCS_NONE.

마지막으로, 다음에서 사용되는 외부 테이블의 경우업데이트, 삭제또는업데이트/공유 선택명령이 행 잠금으로 지정되지 않은 경우 다음을 수행하여 전체 행을 복사하도록 기본 선택을 재정의할 수 있습니다.GetForeignRowMarkType옵션 선택ROW_MARK_REFERENCE배트맨 토토 강도가 확인될 때LCS_NONE. 이로 인해 발생합니다RefetchForeignRow다음 값으로 호출됩니다.마크유형; 그런 다음 새로운 잠금을 획득하지 않고 행을 다시 페치해야 합니다. (다음이 있는 경우GetForeignRowMarkType기능을 수행하지만 배트맨 토토 해제된 행을 다시 가져오고 싶지 않으면 옵션을 선택하세요ROW_MARK_COPYforLCS_NONE.)

참조src/include/nodes/lockoptions.h,에 대한 댓글RowMarkType그리고PlanRowMarkinsrc/include/nodes/plannodes.h및에 대한 댓글ExecRowMarksrc/include/nodes/execnodes.h추가 정보를 확인하세요.

수정사항 제출

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