libpq파이프 라인 모드를 사용하면 응용 프로그램이 이전에 보낸 쿼리의 결과를 읽지 않고도 쿼리를 보낼 수 있습니다. 파이프 라인 모드를 활용하면 클라이언트는 단일 네트워크 트랜잭션에서 여러 쿼리/결과를 보내거나받을 수 있기 때문에 서버를 기다릴 수 있습니다.
파이프 무지개 토토 모드는 상당한 성능 향상을 제공하지만 파이프 무지개 토토 모드를 사용하는 클라이언트를 작성하는 클라이언트는 보류중인 쿼리 대기열을 관리하고 큐의 쿼리에 해당하는 결과를 찾는 것이 포함되기 때문에 더 복잡합니다..
파이프 무지개 토토 모드는 일반적으로 클라이언트와 서버 모두에 더 많은 메모리를 소비하지만, 보내기/수신 큐의 신중하고 공격적인 관리가이를 완화 할 수 있습니다. 이것은 연결이 차단되었는지 또는 비 차단 모드인지 여부를 적용합니다.
Whilelibpq의 파이프 무지개 토토 API가 소개되었습니다PostgreSQL14, 특수 서버 지원이 필요하지 않고 V3 확장 쿼리 프로토콜을 지원하는 모든 서버에서 작동하는 클라이언트 측 기능입니다. 자세한 내용은 참조섹션 54.2.4.
파이프 무지개 토토을 발행하려면 응용 프로그램이 연결을 파이프 무지개 토토 모드로 전환해야합니다.PQENTERPIPELINEMODE
. PQPIPELINESTATUS
파이프 무지개 토토 모드가 활성인지 테스트하는 데 사용할 수 있습니다. 파이프 무지개 토토 모드에서만PostgreSQL : 문서 : 개발 : 32.4. 비동기 스포츠 토토 사이트 처리확장 쿼리 프로토콜을 사용하는 것은 허용되며, 여러 SQL 명령을 포함하는 명령 문자열이 허용되지 않으며copy
. 동기식 명령 실행 함수 사용PQFN
, PQEXEC
, pqexecparams
, pqprepare
, pqExecprepared
, pqdescribePrepared
, pqdescribePortal
, pqcloseprepared
, PQclosePortal
, 오류 조건입니다.pqsendquery
간단한 쿼리 프로토콜을 사용하기 때문에 허용되지 않습니다. 모든 파견 된 명령이 결과를 처리하고 최종 파이프 무지개 토토 결과가 소비되면 응용 프로그램은를 사용하여 비 지정 모드로 돌아갈 수 있습니다.PQEXITPIPELINEMODE
.
파이프 무지개 토토 모드를 사용하는 것이 가장 좋습니다libpqinnon-blocking mode. If used in blocking mode it is possible for a client/server deadlock to occur.[15]
파이프 무지개 토토 모드를 입력 한 후 응용 프로그램은를 사용하여 요청을 발송합니다.pqsendqueryparams
또는 준비된 형제 자매pqsendqueryprepared
. 이러한 요청은 서버로 플러시 될 때까지 클라이언트 측에서 대기됩니다. 이것은 발생합니다PQPIPELINESYNC
is used to establish a synchronization point in the pipeline, or whenPQflush
호출됩니다. 기능pqsendprepare
, pqsendDescribreprepared
, pqsenddescribePortal
, PQSENDCLOSEPREPARED
및PQSENDCLOSEPORTAL
파이프 무지개 토토 모드에서도 작동합니다. 결과 처리는 아래에 설명되어 있습니다.
The server executes statements, and returns results, in the order the client sends them. The server will begin executing the commands in the pipeline immediately, not waiting for the end of the pipeline. Note that results are buffered on the server side; the server flushes that buffer when a synchronization point is established with eitherPQPIPELINESYNC
또는PQSENDPIPELINESYNC
또는 언제pqsendflushrequest
호출됩니다. 명령문이 오류가 발생하면 서버는 현재 트랜잭션을 중단하고 다음 동기화 지점까지 큐에서 후속 명령을 실행하지 않습니다. 에이pgres_pipeline_aborted
결과는 각 명령에 대해 생성됩니다. (파이프 무지개 토토의 명령이 트랜잭션을 롤백하더라도 사실 상태로 남아 있습니다.) 동기화 지점 후에 쿼리 처리가 재개됩니다.
한 작업이 이전의 결과에 의존하는 것은 괜찮습니다. 예를 들어, 한 쿼리는 동일한 파이프 라인에서 다음 쿼리가 사용하는 테이블을 정의 할 수 있습니다. 마찬가지로 응용 프로그램은 이름이 지정된 명령문을 작성하여 동일한 파이프 라인의 이후 문으로 실행할 수 있습니다.
파이프 무지개 토토에서 하나의 쿼리 결과를 처리하려면 응용 프로그램이 호출됩니다.pqgetresult
반복적으로 각 결과를 처리 할 때까지 각 결과를 처리합니다pqgetresult
NULL을 반환합니다. 파이프 무지개 토토의 다음 쿼리 결과를 사용하여를 사용하여 검색 할 수 있습니다.pqgetresult
다시 사이클이 반복되었습니다. 응용 프로그램은 개별 명세서 결과를 정상적으로 처리합니다. 파이프 무지개 토토의 모든 쿼리 결과가 반환되면pqgetresult
상태 값이 포함 된 결과를 반환pgres_pipeline_sync
클라이언트는 전체 파이프 무지개 토토이 전송 될 때까지 결과 처리를 연기하거나 파이프 무지개 토토에서 추가 쿼리를 보내는 것을 인터 리브 할 수 있습니다. 보다섹션 32.5.1.4.
pqgetresult
새로운 것을 포함 할 수있는 경우를 제외하고 정상적인 비동기 처리와 동일하게 행동합니다pgresult
타입pgres_pipeline_sync
andpgres_pipeline_aborted
. pgres_pipeline_sync
각각에 대해 정확히 한 번보고됩니다PQPIPELINESYNC
또는PQSENDPIPELINESYNC
파이프 무지개 토토의 해당 지점에서.pgres_pipeline_aborted
첫 번째 오류에 대한 일반 쿼리 결과 대신 방출됩니다.pgres_pipeline_sync
; 보다섹션 32.5.1.3.
PQISBUSY
, pqconsumeInput
등은 파이프 무지개 토토 결과를 처리 할 때 정상적으로 작동합니다. 특히, 전화PQISBUSY
파이프 무지개 토토 중간에서 지금까지 발행 된 모든 쿼리의 결과가 소비 된 경우 파이프 무지개 토토 중간에 0을 반환합니다.
libpq현재 처리중인 쿼리에 대한 응용 프로그램에 정보를 제공하지 않습니다 (pqgetresult
NULL을 반환하여 다음 쿼리의 결과를 반환하기 시작한다는 것을 나타냅니다). 응용 프로그램은 쿼리를 보낸 순서를 추적하여 해당 결과와 연결해야합니다. 응용 프로그램은 일반적으로 상태 기계 또는 FIFO 대기열을 사용합니다.
고객의 관점에서pqresultstatus
반환pgres_fatal_error
, 파이프 무지개 토토은 낙태로 표시됩니다.pqresultstatus
보고서 apgres_pipeline_aborted
중단 된 파이프 무지개 토토에서 나머지 대기열 작업에 대한 결과. 결과PQpipelineSync
또는PQSENDPIPELINESYNC
pgres_pipeline_sync
중단 된 파이프 무지개 토토의 끝과 정상 결과 처리의 재개를 알리려면
클라이언트필수프로세스 결과pqgetresult
during error recovery.
파이프 무지개 토토이 암시 적 트랜잭션을 사용한 경우 이미 실행 된 작업이 롤백되고 실패한 작업을 따를 수 있도록 대기하는 작업이 완전히 건너 뜁니다. 파이프 무지개 토토이 시작되고 단일 명시 적 트랜잭션을 수행하는 경우 동일한 동작이 유지됩니다 (예 : 첫 번째 진술은시작
그리고 마지막은커밋
) 세션이 파이프 무지개 토토 끝에 중단 된 트랜잭션 상태에 남아 있다는 점을 제외하고. 파이프 무지개 토토에 포함 된 경우다중 명시적인 거래, 오류 전에 저지른 모든 트랜잭션은 커밋 된 상태로 유지되며 현재 진행중인 트랜잭션은 중단되며 후속 거래를 포함하여 모든 후속 운영이 완전히 건너 뜁니다. 파이프 라인 동기화 지점이 중단 된 상태의 명시 적 트랜잭션 블록과 함께 발생하면 다음 명령이 트랜잭션을 정상 모드로 설정하지 않으면 다음 파이프 라인이 즉시 중단됩니다.롤백
.
클라이언트는 작업이 커밋되었다고 가정해서는 안됩니다보내기a커밋
- 커밋이 완료되었는지 확인하기 위해 해당 결과가 수신 된 경우에만. 오류가 비동기식으로 도달하기 때문에 응용 프로그램은 마지막부터 다시 시작할 수 있어야합니다.수신committed change and resend work done after that point if something goes wrong.
대형 파이프 라인의 교착 상태를 피하려면 클라이언트는와 같은 운영 체제 시설을 사용하여 비 차단 이벤트 루프 주위에 구성되어야합니다.select
, 폴
, WaitformultipleObjectex
등
클라이언트 응용 프로그램은 일반적으로 파견 될 작업 대기열과 파견되었지만 아직 결과가 처리되지 않은 작업 대기열을 유지해야합니다. 소켓을 쓰면 더 많은 작업을 파견해야합니다. 소켓을 읽을 수 있으면 결과를 읽고 처리하여 해당 결과 대기열의 다음 항목과 일치시켜야합니다. 사용 가능한 메모리를 기준으로 소켓의 결과를 자주 읽어야합니다. 파이프 라인이 끝날 때까지 기다릴 필요가 없습니다. 파이프 라인은 논리적 인 작업 단위로, 일반적으로 파이프 라인 당 하나의 트랜잭션이 아닙니다. 파이프 라인 모드를 종료하고 파이프 라인간에 다시 들어 올리거나 다음 번을 보내기 전에 하나의 파이프 라인이 완료 될 때까지 기다릴 필요가 없습니다.
사용 예select ()
그리고 전송 및받은 작업을 추적하기위한 간단한 상태 기계가입니다.src/test/modules/libpq_pipeline/libpq_pipeline.c
PostgreSQL 소스 분포에서.
PQPIPELINESTATUS
#현재 파이프 라인 모드 상태를 반환합니다libpq연결.
pgpipelinestatus pqpipelinestatus (const pgconn *conn);
PQPIPELINESTATUS
다음 값 중 하나를 반환 할 수 있습니다.
pq_pipeline_on
thelibpq연결은 파이프 무지개 토토 모드에 있습니다.
pq_pipeline_off
thelibpq연결 ISnot파이프 무지개 토토 모드에서.
pq_pipeline_aborted
thelibpq연결은 파이프 라인 모드에 있으며 현재 파이프 라인을 처리하는 동안 오류가 발생했습니다. 중단 된 깃발은pqgetresult
유형의 결과를 반환pgres_pipeline_sync
.
PQENTERPIPELINEMODE
#현재 유휴 상태이거나 이미 파이프 라인 모드에있는 경우 파이프 라인 모드에 연결됩니다.
int pqenterpipelinemode (pgconn *conn);
성공을 위해 1을 반환합니다. 연결이 현재 유휴 상태가 아닌 경우 0을 반환하고 효과가 없습니다. 즉, 결과가 준비되거나 서버에서 더 많은 입력을 기다리고 있습니다.libpq연결 상태.
PQEXITPIPELINEMODE
#현재 빈 큐가 있고 보류중인 결과가없는 파이프 라인 모드에있는 경우 파이프 라인 모드를 종료합니다.
int pqexitpipelinemode (pgconn *conn);
성공을 위해 1을 반환합니다. 파이프 라인 모드가 아닌 경우 1을 반환하고 조치를 취하지 않습니다. 현재 명세서가 처리가 완료되지 않은 경우, 또는pqgetresult
이전에 보낸 모든 쿼리에서 결과를 수집하기 위해 호출되지 않았습니다.PQERRORMESSAGE
실패에 대한 자세한 정보를 얻으려면).
PQPIPELINESYNC
#a를 보내서 파이프 무지개 토토의 동기화 지점을 표시합니다동기화 메시지및 보내기 버퍼를 플러싱합니다. 이것은 암시 적 트랜잭션의 구분 기자 역할을하며 오류 복구 지점입니다. 보다섹션 32.5.1.3.
int pqpipelinesync (pgconn *conn);
성공을 위해 1을 반환합니다. 연결이 파이프 라인 모드에 있지 않거나 A를 보내는 경우 0 리턴 0동기화 메시지실패.
PQSENDPIPELINESYNC
#a를 보내서 파이프 무지개 토토의 동기화 지점을 표시합니다동기화 메시지보내지 않고 보내지 않습니다. 이것은 암시 적 트랜잭션의 구분 기자 역할을하며 오류 복구 지점입니다. 보다섹션 32.5.1.3.
int pqsendpipelinesync (pgconn *conn);
Returns 1 for success. Returns 0 if the connection is not in pipeline mode or sending a동기화 메시지실패. 메시지 자체가 서버 자체가 자동으로 플러시되지 않습니다. 사용pqflush
필요한 경우.
pqsendflushrequest
#서버가 출력 버퍼를 플러시하라는 요청을 보냅니다.
int pqsendflushrequest (pgconn *conn);
성공을 위해 1을 반환합니다. 실패로 0을 반환합니다.
서버는의 결과로 출력 버퍼를 자동으로 플러시합니다.PQPIPELINESYNC
being called, or on any request when not in pipeline mode; this function is useful to cause the server to flush its output buffer in pipeline mode without establishing a synchronization point. Note that the request is not itself flushed to the server automatically; 사용pqflush
필요한 경우.
비동기 쿼리 모드와 마찬가지로 파이프 라인 모드를 사용할 때 의미있는 성능 오버 헤드가 없습니다. 클라이언트 애플리케이션 복잡성을 증가시키고 클라이언트/서버 교착 상태를 방지하기 위해서는 추가주의가 필요하지만 파이프 라인 모드는 메모리 사용이 더 오래 남아있을 수없는 대가로 상당한 성능 향상을 제공 할 수 있습니다..
Pipeline mode is most useful when the server is distant, i.e., network latency (“Ping Time”)가 높고 많은 소규모 작업이 급속히 연속적으로 수행 될 때. 각 쿼리가 클라이언트/서버 왕복 시간의 여러 배수를 실행하는 경우 파이프 라인 명령을 사용하는 데 일반적으로 이점이 적습니다. 300ms 왕복 시간에 서버에서 실행되는 100 스테이트 작업은 파이프를 사용하지 않고 네트워크 대기 시간 만 30 초가 걸립니다. 파이프 라인을 사용하면 서버의 결과를 기다리는 0.3 초에 소비 될 수 있습니다.
응용 프로그램이 작을 때 파이프 무지개 토토 명령 사용INSERT
, 업데이트
and삭제
세트의 작업 또는 A로 쉽게 변환 할 수없는 작업copy
작동.
파이프 라인 모드는 클라이언트가 다음 작업을 생성하기 위해 한 작업의 정보가 필요할 때 유용하지 않습니다. 이러한 경우 클라이언트는 동기화 지점을 도입하고 필요한 결과를 얻기 위해 전체 클라이언트/서버 왕복을 기다려야합니다. 그러나 필요한 정보 서버 측을 교환하기 위해 클라이언트 설계를 조정하는 경우가 종종 있습니다. 읽기 모형 쓰기 사이클은 특히 좋은 후보입니다. 예를 들어:
시작; 업데이트하려면 id = 42 인 MyTable에서 X를 선택하십시오. - 결과 : x = 2 - 클라이언트는 1에서 x를 추가합니다. mytable set x = 3 여기서 id = 42 업데이트; 저지르다;
훨씬 더 효율적으로 수행 할 수 있습니다 :
MyTable Set x = x + 1 업데이트 여기서 id = 42;
단일 파이프 무지개 토토에 여러 트랜잭션이 포함되어있을 때 파이프 릴링은 덜 유용하고 복잡합니다 (참조섹션 32.5.1.3).
[15]클라이언트는 서버로 쿼리를 보내려고 시도하지만 서버는 이미 처리 된 쿼리에서 클라이언트에 결과를 보내려고 시도합니다. 이는 클라이언트가 서버에서 처리 입력으로 전환하기 전에 출력 버퍼와 서버의 수신 버퍼를 채울 수있는 충분한 쿼리를 보낼 때만 발생하지만 언제 발생할 것인지 정확히 예측하기는 어렵습니다..