32.5. 파이프스포츠 토토 결과 모드#

libpq파이프라인 모드를 사용하면 응용프로그램이 이전에 보낸 쿼리의 결과를 읽지 않고도 쿼리를 보낼 수 있습니다. 파이프라인 모드를 활용하면 단일 네트워크 트랜잭션에서 여러 쿼리/결과를 보내고 받을 수 있으므로 클라이언트가 서버를 기다리는 시간이 줄어듭니다.

파이프스포츠 토토 결과 모드는 상당한 성능 향상을 제공하지만 파이프스포츠 토토 결과 모드를 사용하여 클라이언트를 작성하는 것은 대기 중인 쿼리의 대기열을 관리하고 대기열의 어떤 쿼리에 해당하는 결과를 찾는 작업을 포함하기 때문에 더 복잡합니다.

파이프스포츠 토토 결과 모드는 일반적으로 클라이언트와 서버 모두에서 더 많은 메모리를 소비하지만 보내기/받기 대기열을 신중하고 적극적으로 관리하면 이를 완화할 수 있습니다. 이는 연결이 차단 모드인지 비차단 모드인지 여부에 관계없이 적용됩니다.

그동안libpq의 파이프라인 API는 다음에서 도입되었습니다.포스트그레SQL14, 이는 특별한 서버 지원이 필요하지 않고 v3 확장 쿼리 프로토콜을 지원하는 모든 서버에서 작동하는 클라이언트 측 기능입니다. 자세한 내용은 참조섹션 54.2.4.

32.5.1. 파이프스포츠 토토 결과 모드 사용#

파이프라인을 실행하려면 애플리케이션은 연결을 파이프라인 모드로 전환해야 하며, 이는 다음과 같이 수행됩니다.PQenterPipelineMode. PQ파이프스포츠 토토 결과상태파이프스포츠 토토 결과 모드가 활성화되어 있는지 테스트하는 데 사용할 수 있습니다. 파이프스포츠 토토 결과 모드에서는 만PostgreSQL : 문서 : 18 : 32.4. 비동기 토토 커뮤니티 처리확장 쿼리 프로토콜을 활용하는 것은 허용되며, 여러 SQL 명령을 포함하는 명령 문자열은 허용되지 않습니다.복사. 다음과 같은 동기 명령 실행 함수 사용PQfn, PQexec, PQexecParams, PQprepare, PQexec준비됨, PQdescribe준비됨, PQdescribePortal, PQclose준비됨, PQclosePortal은 오류 조건입니다.PQsendQuery또한 단순 쿼리 프로토콜을 사용하므로 허용되지 않습니다. 전달된 모든 명령이 결과를 처리하고 최종 파이프라인 결과가 소비되면 애플리케이션은 다음을 사용하여 비파이프라인 모드로 돌아갈 수 있습니다.PQexitPipelineMode.

참고

다음과 함께 파이프라인 모드를 사용하는 것이 가장 좋습니다.libpq비차단 모드. 차단 모드에서 사용하면 클라이언트/서버 교착 상태가 발생할 수 있습니다.[15]

32.5.1.1. 쿼리 발행#

파이프라인 모드에 들어간 후 애플리케이션은 다음을 사용하여 요청을 전달합니다.PQsendQueryParams또는 준비된 쿼리 형제PQsendQuery준비됨. 이러한 요청은 서버로 플러시될 때까지 클라이언트 측 대기열에 보관됩니다. 이는 다음과 같은 경우에 발생합니다.PQpipelineSync파이프스포츠 토토 결과에서 동기화 지점을 설정하는 데 사용됩니다.PQ플러시호출됩니다. 기능PQsendPrepare, PQsendDescribe준비됨, PQsendDescribePortal, PQsendClose준비됨PQsendClosePortal또한 파이프스포츠 토토 결과 모드에서도 작동합니다. 결과 처리는 아래에 설명되어 있습니다.

서버는 클라이언트가 보내는 순서대로 명령문을 실행하고 결과를 반환합니다. 서버는 파이프라인이 끝날 때까지 기다리지 않고 즉시 파이프라인에서 명령 실행을 시작합니다. 결과는 서버측에서 버퍼링됩니다. 다음 중 하나를 사용하여 동기화 지점이 설정되면 서버는 해당 버퍼를 플러시합니다.PQpipelineSync또는PQsendPipelineSync또는 언제PQsendFlush요청호출됩니다. 문에 오류가 발생하면 서버는 현재 트랜잭션을 중단하고 다음 동기화 지점까지 대기열에 있는 후속 명령을 실행하지 않습니다. 에PGRES_PIPELINE_ABORTED13510_13701

한 작업이 이전 작업의 결과에 의존하는 것은 괜찮습니다. 예를 들어 한 쿼리는 동일한 파이프라인의 다음 쿼리가 사용하는 테이블을 정의할 수 있습니다. 마찬가지로 애플리케이션은 명명된 준비된 문을 생성하고 동일한 파이프라인의 이후 문과 함께 이를 실행할 수 있습니다.

32.5.1.2. 처리 결과#

파이프라인에서 하나의 쿼리 결과를 처리하기 위해 애플리케이션은 다음을 호출합니다.PQgetResult반복적으로 실행하고 다음까지 각 결과를 처리합니다.PQgetResult널을 반환합니다. 파이프라인의 다음 쿼리 결과는 다음을 사용하여 검색할 수 있습니다.PQgetResult다시 그리고 주기가 반복되었습니다. 애플리케이션은 개별 명령문 결과를 정상적으로 처리합니다. 파이프스포츠 토토 결과의 모든 쿼리 결과가 반환되면,PQgetResult상태 값이 포함된 결과를 반환합니다.PGRES_PIPELINE_SYNC

클라이언트는 전체 파이프스포츠 토토 결과이 전송될 때까지 결과 처리를 연기하거나 파이프스포츠 토토 결과에서 추가 쿼리를 전송하면서 이를 인터리브하도록 선택할 수 있습니다. 참조섹션 32.5.1.4.

PQgetResult새 항목을 포함할 수 있다는 점을 제외하면 일반 비동기 처리와 동일하게 작동합니다.PGresult유형PGRES_PIPELINE_SYNC그리고PGRES_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 대기열을 사용합니다.

32.5.1.3. 오류 처리#

고객의 관점에서, 이후PQresultStatus반환PGRES_FATAL_ERROR, 파이프스포츠 토토 결과이 중단된 것으로 표시됩니다.PQresultStatus다음을 보고합니다PGRES_PIPELINE_ABORTED17527_17612PQpipelineSync또는PQsendPipelineSync다음과 같이 보고됩니다.PGRES_PIPELINE_SYNC중단된 파이프스포츠 토토 결과의 종료와 정상적인 결과 처리 재개를 신호합니다.

클라이언트반드시결과 처리PQgetResult오류 복구 중.

파이프스포츠 토토 결과이 암시적 트랜잭션을 사용한 경우 이미 실행된 작업은 롤백되고 실패한 작업을 따르기 위해 대기열에 있던 작업은 완전히 건너뜁니다. 파이프스포츠 토토 결과이 단일 명시적 트랜잭션을 시작하고 커밋하는 경우에도 동일한 동작이 적용됩니다(즉, 첫 번째 문은시작그리고 마지막은커밋) 단, 세션은 파이프라인 끝에서 중단된 트랜잭션 상태로 유지됩니다. 파이프라인에 다음이 포함된 경우여러 명시적 트랜잭션, 오류 이전에 커밋된 모든 트랜잭션은 커밋된 상태로 유지되고, 현재 진행 중인 트랜잭션은 중단되며, 후속 트랜잭션을 포함하여 모든 후속 작업은 완전히 건너뜁니다. 중단된 상태의 명시적 트랜잭션 블록과 함께 파이프라인 동기화 지점이 발생하는 경우 다음 명령이 트랜잭션을 일반 모드로 전환하지 않는 한 다음 파이프라인은 즉시 중단됩니다.롤백.

참고

클라이언트는 작업이 커밋될 때 작업이 커밋되었다고 가정해서는 안 됩니다.보냄 a 커밋— 커밋이 완료되었음을 확인하기 위해 해당 결과가 수신된 경우에만. 오류는 비동기적으로 도착하므로 애플리케이션을 마지막부터 다시 시작할 수 있어야 합니다.수신변경 사항을 커밋하고 문제가 발생하면 그 시점 이후에 완료된 작업을 다시 보냅니다.

32.5.1.4. 인터리빙 결과 처리 및 쿼리 발송#

대규모 파이프라인의 교착 상태를 방지하려면 다음과 같은 운영 체제 기능을 사용하여 비차단 이벤트 루프를 중심으로 클라이언트를 구성해야 합니다.선택, 설문조사, WaitForMultipleObjectEx

클라이언트 응용프로그램은 일반적으로 디스패치될 남은 작업 대기열과 디스패치되었지만 아직 결과가 처리되지 않은 작업 대기열을 유지해야 합니다. 소켓이 쓰기 가능해지면 더 많은 작업을 전달해야 합니다. 소켓을 읽을 수 있으면 결과를 읽고 처리하여 해당 결과 대기열의 다음 항목과 일치시켜야 합니다. 사용 가능한 메모리에 따라 소켓의 결과를 자주 읽어야 합니다. 결과를 읽기 위해 파이프라인이 끝날 때까지 기다릴 필요가 없습니다. 파이프라인은 논리적 작업 단위로 범위가 지정되어야 하며 일반적으로 파이프라인당 하나의 트랜잭션(반드시 그런 것은 아님)입니다. 파이프라인 모드를 종료하고 파이프라인 사이에 다시 들어갈 필요가 없으며 다음 파이프라인을 보내기 전에 한 파이프라인이 완료될 때까지 기다릴 필요가 없습니다.

다음을 사용한 예선택()그리고 보내고 받은 작업을 추적하기 위한 간단한 상태 머신이 있습니다src/test/modules/libpq_pipeline/libpq_pipeline.cPostgreSQL 소스 배포판에 있습니다.

32.5.2. 파이프스포츠 토토 결과 모드와 관련된 기능#

PQ파이프스포츠 토토 결과상태 #

현재 파이프라인 모드 상태를 반환합니다.libpq연결.

PGpipelineStatus PQpipelineStatus(const PGconn *conn);

PQ파이프스포츠 토토 결과상태다음 값 중 하나를 반환할 수 있습니다:

PQ_PIPELINE_ON

libpq연결이 파이프스포츠 토토 결과 모드에 있습니다.

PQ_PIPELINE_OFF

libpq연결은아님파이프스포츠 토토 결과 모드에서.

PQ_PIPELINE_ABORTED

libpq연결이 파이프라인 모드에 있으며 현재 파이프라인을 처리하는 동안 오류가 발생했습니다. 중단된 플래그는 다음과 같은 경우에 지워집니다.PQgetResult유형의 결과를 반환합니다.PGRES_PIPELINE_SYNC.

PQenterPipelineMode #

연결이 현재 유휴 상태이거나 이미 파이프라인 모드인 경우 파이프라인 모드로 들어가도록 합니다.

int PQenterPipelineMode(PGconn *conn);

성공하면 1을 반환합니다. 0을 반환하고 연결이 현재 유휴 상태가 아니면 아무런 효과가 없습니다. 즉, 결과가 준비되어 있거나 서버에서 추가 입력을 기다리고 있는 경우 등입니다. 이 함수는 실제로 서버에 아무 것도 보내지 않고 단지libpq연결 상태.

PQexitPipelineMode #

현재 대기열이 비어 있고 보류 중인 결과가 없는 파이프라인 모드에 있는 경우 연결이 파이프라인 모드를 종료하도록 합니다.

int PQexitPipelineMode(PGconn *conn);

성공하면 1을 반환합니다. 1을 반환하고 파이프라인 모드가 아닌 경우 아무 조치도 취하지 않습니다. 현재 문 처리가 완료되지 않은 경우 또는PQgetResult이전에 전송된 모든 쿼리에서 결과를 수집하기 위해 호출되지 않았으며 0을 반환합니다(이 경우에는PQerrorMessage실패에 대한 추가 정보를 얻으려면).

PQpipelineSync #

다음을 보내 파이프라인의 동기화 지점을 표시합니다.동기화 메시지그리고 전송 버퍼를 플러시합니다. 이는 암시적 트랜잭션과 오류 복구 지점의 구분 기호 역할을 합니다. 보다섹션 32.5.1.3.

int PQpipelineSync(PGconn *conn);

성공하면 1을 반환합니다. 연결이 파이프라인 모드가 아니거나를 보내는 경우 0을 반환합니다.동기화 메시지실패했습니다.

PQsendPipelineSync #

다음을 보내 파이프라인의 동기화 지점을 표시합니다.동기화 메시지전송 버퍼를 플러시하지 않고. 이는 암시적 트랜잭션과 오류 복구 지점의 구분 기호 역할을 합니다. 참조섹션 32.5.1.3.

int PQsendPipelineSync(PGconn *conn);

성공하면 1을 반환합니다. 연결이 파이프라인 모드가 아니거나를 보내는 경우 0을 반환합니다.동기화 메시지실패했습니다. 메시지 자체는 서버에 자동으로 플러시되지 않습니다. 사용PQ플러시필요하다면.

PQsendFlush요청 #

서버에 출력 버퍼를 플러시하라는 요청을 보냅니다.

int PQsendFlushRequest(PGconn *conn);

성공하면 1을 반환합니다. 실패하면 0을 반환합니다.

서버는 다음의 결과로 자동으로 출력 버퍼를 플러시합니다.PQpipelineSync호출 중이거나 파이프스포츠 토토 결과 모드가 아닐 때 요청 시; 이 함수는 서버가 동기화 지점을 설정하지 않고 파이프스포츠 토토 결과 모드에서 출력 버퍼를 플러시하도록 하는 데 유용합니다. 요청 자체는 서버에 자동으로 플러시되지 않습니다. 사용PQ플러시필요하다면.

32.5.3. 파이프스포츠 토토 결과 모드를 사용하는 경우#

비동기 쿼리 모드와 마찬가지로 파이프라인 모드를 사용할 때 의미 있는 성능 오버헤드가 없습니다. 이는 클라이언트 애플리케이션의 복잡성을 증가시키고 클라이언트/서버 교착 상태를 방지하기 위해 특별한 주의가 필요하지만 파이프라인 모드는 메모리 사용량이 증가하여 상태를 더 오래 유지하는 대신 상당한 성능 향상을 제공할 수 있습니다.

파이프스포츠 토토 결과 모드는 서버가 멀리 떨어져 있을 때, 즉 네트워크 지연 시간이 있을 때 가장 유용합니다. (핑 시간)이 높으며, 많은 작은 작업이 연속적으로 빠르게 수행되는 경우에도 마찬가지입니다. 일반적으로 각 쿼리를 실행하는 데 클라이언트/서버 왕복 시간의 여러 배가 걸리는 경우 파이프라인 명령을 사용하면 이점이 적습니다. 왕복 시간이 300ms 떨어진 서버에서 실행되는 100개 문 작업은 파이프라인 없이 네트워크 대기 시간만 30초가 걸립니다. 파이프라인을 사용하면 서버의 결과를 기다리는 데 0.3초 정도 소요될 수 있습니다.

애플리케이션이 작은 작업을 많이 수행할 때 파이프스포츠 토토 결과 명령을 사용하십시오.삽입, 업데이트그리고삭제집합에 대한 연산이나 집합으로 쉽게 변환할 수 없는 연산복사작동.

파이프라인 모드는 클라이언트가 다음 작업을 생성하기 위해 한 작업의 정보가 필요한 경우 유용하지 않습니다. 이러한 경우 클라이언트는 동기화 지점을 도입하고 필요한 결과를 얻기 위해 전체 클라이언트/서버 왕복을 기다려야 합니다. 그러나 필요한 정보를 서버 측에서 교환하기 위해 클라이언트 디자인을 조정하는 것이 가능한 경우가 많습니다. 읽기-수정-쓰기 주기가 특히 좋은 후보입니다. 예를 들면:

시작;
SELECT x FROM mytable WHERE id = 42 FOR UPDATE;
-- 결과: x=2
-- 클라이언트는 x에 1을 더합니다:
UPDATE mytable SET x = 3 WHERE id = 42;
커밋;

다음을 사용하면 훨씬 더 효율적으로 수행할 수 있습니다.

mytable SET x = x + 1 WHERE id = 42 업데이트;

단일 파이프스포츠 토토 결과에 여러 트랜잭션이 포함된 경우 파이프라이닝은 덜 유용하고 더 복잡합니다(참조섹션 32.5.1.3).



[15]클라이언트는 서버에 쿼리를 보내는 시도를 차단하지만, 서버는 이미 처리한 쿼리에서 클라이언트로 결과를 보내는 시도를 차단합니다. 이는 클라이언트가 서버에서 입력 처리로 전환하기 전에 출력 버퍼와 서버의 수신 버퍼를 모두 채우기에 충분한 쿼리를 보내는 경우에만 발생하지만, 그 일이 언제 발생할지 정확히 예측하기는 어렵습니다.

수정 사항 제출

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