이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 58.1. 사설 토토 사이트 방법 지원 기능버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

55.1. 샘플링 방법 지원 기능

TSM 핸들러 함수는 palloc'd를 반환합니다tsmroutine아래에 설명 된지지 기능에 포인터를 포함하는 구조. 대부분의 함수는 필요하지만 일부는 선택 사항이며 해당 포인터는 Null이 될 수 있습니다.

무효
Samplescangetsamplesize (plannerinfo *root,
                         reploptinfo *baserel,
                         목록 *paramexprs,
                         BlockNumber *페이지,
                         더블 *튜플);

이 기능은 계획 중에 호출됩니다. 샘플 스캔 중에 읽을 관계 페이지의 수와 스캔에서 선택할 튜플 수를 추정해야합니다. (예를 들어, 샘플링 분수를 추정 한 다음을 곱하여 결정될 수 있습니다.Baserel- PagesandBaserel- Tuples그 숫자, 결과를 적분 값으로 반올림해야합니다.)paramexprs목록은에 매개 변수 인 표현식을 보유합니다.테이블 샘플절. 사용하는 것이 좋습니다estimate_expression_value ()추정 목적으로 값이 필요한 경우, 이러한 표현을 상수로 줄이려는 것; 그러나 함수는 감소 할 수없는 경우에도 크기 추정치를 제공해야하며, 값이 유효하지 않은 경우에도 실패하지 않아야합니다 (런타임 값이 무엇인지 추정치 만 기억합니다). 그만큼페이지and튜플매개 변수는 출력입니다.

무효
initsamplescan (samplescanstate *노드,
                int eflags);

Samplescan 계획 노드 실행을 위해 초기화. 이것은 집행자 스타트 업 동안 호출됩니다. 처리가 시작되기 전에 필요한 초기화를 수행해야합니다. 그만큼samplescanstate노드가 이미 생성되었지만 그TSM_STATE필드는 null입니다. 그만큼initsamplescan함수는 토토 캔 방법에 필요한 내부 상태 데이터가 무엇이든 할 수 있고, 포인터를 보관할 수 있습니다.node- tsm_state. 스캔 할 테이블에 대한 정보는 다른 필드를 통해 액세스 할 수 있습니다.samplescanstate노드 (그러나node- ss.ss_currentscandesc스캔 디스크립터는 아직 설정되지 않았습니다).eflags이 계획 노드에 대한 집행자의 작동 모드를 설명하는 플래그 비트가 포함되어 있습니다.

언제(eflags & exec_flag_explain_only)사실, 스캔은 실제로 수행되지 않으므로이 기능은 노드 상태를 |설명andendsamplescan.

이 함수를 생략 할 수 있습니다 (포인터를 NULL로 설정).Startinsamplescan토토 캔 방법에 필요한 모든 초기화를 수행해야합니다.

무효
steginsamplescan (samplescanstate *노드,
                 데이텀 *매개 변수,
                 int nparams,
                 UINT32 시드);

샘플링 스캔 실행을 시작합니다. 이것은 튜플을 가져 오려는 첫 번째 시도 직전에 호출되며 스캔을 다시 시작 해야하는 경우 다시 호출 될 수 있습니다. 스캔 할 테이블에 대한 정보는의 필드를 통해 액세스 할 수 있습니다.samplescanstate노드 (그러나node- ss.ss_currentscandesc스캔 디스크립터는 아직 설정되지 않았습니다). 그만큼params배열, 길이NPARAMS,에 제공된 매개 변수의 값이 포함되어 있습니다.테이블 샘플절. 여기에는 토토 캔 방법에 지정된 수와 유형이 있습니다.ParameterTypesList, NULL이 아닌 것으로 확인되었습니다.씨앗샘플링 방법 내에서 생성 된 임의의 숫자에 사용할 씨앗이 포함됩니다. 그것은에서 파생 된 해시입니다.반복 가능한하나가 주어진 경우 가치 또는 결과random ()그렇지 않으면.

이 함수는 필드를 조정할 수 있습니다node- use_bulkreadnode- use_pagemode. 만약에node- use_bulkreadistrue, 기본적으로 스캔은 사용 후 재활용 버퍼를 장려하는 버퍼 액세스 전략을 사용합니다. 이것을 설정하는 것이 합리적 일 수 있습니다거짓스캔이 테이블 페이지의 작은 부분 만 방문하는 경우. 만약에node- use_pagemodeistrue, 기본적으로 스캔은 방문한 각 페이지의 모든 튜플에 대한 단일 패스로 가시성 검사를 수행합니다. 이것을 설정하는 것이 합리적 일 수 있습니다거짓스캔이 방문한 각 페이지에서 튜플의 작은 부분 만 선택하는 경우. 이로 인해 튜플 가시성 검사가 더 적을 수 있지만, 각각은 더 많은 잠금이 필요하기 때문에 더 비싸지 만

토토 캔 메소드가 표시되는 경우반복 가능한 _across_scans, 원래와 마찬가지로 구조대 중에 동일한 튜플 세트를 선택할 수 있어야합니다.Startinsamplescan이전과 동일한 튜플을 선택해야합니다 (테이블 샘플매개 변수와 종자는 변하지 않습니다).

블록 번호
nextsampleBlock (samplescanstate *노드);

스캔 할 다음 페이지의 블록 번호를 반환하거나InvalidBlockNumber스캔 할 페이지가없는 경우.

이 함수를 생략 할 수 있습니다 (포인터를 NULL로 설정).이 경우 핵심 코드는 전체 관계의 순차적 스캔을 수행합니다. 이러한 스캔은 동기화 된 스캔을 사용할 수 있으므로 샘플링 방법이 각 스캔에서 관계 페이지가 동일한 순서로 방문한다고 가정 할 수 없습니다.

오프셋 오프
nextsampleTuple (samplescanstate *노드,
                 BlockNumber Blockno,
                 OffsetNumber maxoffset);

지정된 페이지에서 샘플링 할 다음 튜플의 오프셋 번호를 반환합니다.InvalidOffsetNumber튜플을 샘플링 할 남은 상태가없는 경우.Maxoffset페이지에서 사용중인 가장 큰 오프셋 번호입니다.

참고 : NextSampleTuple범위의 오프셋 번호 중 어느 것이 명시 적으로 알려지지 않았습니다1 .. Maxoffset실제로 유효한 튜플이 들어 있습니다. 핵심 코드는 누락 또는 보이지 않는 튜플 샘플 요청을 무시하기 때문에 일반적으로 문제가되지 않습니다. 샘플에서 편견이 생기지 않아야합니다. 그러나 필요한 경우 기능이 검사 할 수 있습니다node- ss.ss_currentscandesc- rs_vistuples []유효하고 보이는 튜플을 식별합니다. (필요node- use_pagemodetrue.)

참고 : NextSampleTuple필수notBlockno가장 최근에 반환 한 동일한 페이지 번호입니다NextsampleBlock전화. 이전에 의해 반환되었습니다.NextsampleBlock전화를 걸지만 핵심 코드는 호출 할 수 있습니다NextsampleBlock실제로 스캔 페이지에 미리 사전 포치를 지원합니다. 주어진 페이지의 샘플링이 시작되면 연속적이라고 가정해도NextSampleTuple통화는 모두 같은 페이지를 참조 할 때까지InvalidOffsetNumber반환되었습니다.

무효
endsamplescan (samplescanstate *노드);

스캔 및 릴리스 리소스를 종료하십시오. 일반적으로 Palloc'd 메모리를 해제하는 것은 중요하지 않지만 외부가 가시 가능한 자원을 정리해야합니다. 이 기능을 생략 할 수 있습니다 (포인터를 NULL로 설정) 그러한 자원이 존재하지 않는 공동 사례에서.