64.1. 토토 캔의 기본 API 구조

각 색인 액세스 방법은 다음 행으로 설명됩니다.pg_am시스템 카탈로그.pg_am항목은 이름을 지정하고핸들러 함수인덱스 액세스 방법입니다. 이러한 항목은 다음을 사용하여 생성 및 삭제할 수 있습니다.액세스 방법 생성그리고삭제 액세스 방법SQL 명령.

색인 액세스 방법 핸들러 함수는 유형의 단일 인수를 허용하도록 선언되어야 합니다.내부그리고 의사 유형을 반환합니다index_am_handler. 인수는 단순히 SQL 명령에서 핸들러 함수가 직접 호출되는 것을 방지하는 역할을 하는 더미 값입니다. 함수의 결과는 유형의 palloc'd 구조체여야 합니다.IndexAmRoutine에는 토토 캔 액세스 방법을 사용하기 위해 핵심 코드가 알아야 하는 모든 것이 포함되어 있습니다.IndexAmRoutine구조체, 액세스 방법이라고도 함API 구조체에는 다중 열 인덱스를 지원할 수 있는지 여부와 같은 액세스 방법의 다양한 고정 속성을 지정하는 필드가 포함되어 있습니다. 더 중요한 것은 인덱스에 액세스하기 위한 모든 실제 작업을 수행하는 액세스 방법에 대한 기능을 지원하는 포인터가 포함되어 있다는 것입니다. 이러한 지원 함수는 일반 C 함수이며 SQL 수준에서 표시되거나 호출할 수 없습니다. 지원 기능은 다음에 설명되어 있습니다.PostgreSQL : 문서 : 15 : 64.2. 색인 액세스 메이저 토토 사이트 기능.

구조IndexAmRoutine다음과 같이 정의됩니다:

typedef 구조체 IndexAmRoutine

    NodeTag 유형;

    /*
     * 탐색/검색할 수 있는 총 전략(연산자) 수
     * 이번 오전.  AM에 고정된 전략 할당 세트가 없으면 0입니다.
     */
    uint16 가지 전략;
    /* 이 AM이 사용하는 총 지원 기능 수 */
    uint16 am지원;
    /* opclass 옵션은 함수 번호 또는 0을 지원합니다 */
    uint16 amoptsprocnum;
    /* AM은 ORDER BY 인덱스 열의 값을 지원합니까? */
    bool amcanorder;
    /* AM은 인덱스 열에 대한 연산자의 ORDER BY 결과를 지원합니까? */
    bool amcanorderbyop;
    /* AM은 역방향 스캔을 지원합니까? */
    bool amcanbackward;
    /* AM은 UNIQUE 인덱스를 지원합니까? */
    bool amcanunique;
    /* AM은 다중 열 인덱스를 지원합니까? */
    bool amcanmulticol;
    /* AM은 첫 번째 인덱스 열에 제약 조건을 적용하기 위해 스캔을 요구합니까? */
    bool am선택적 키;
    /* AM은 ScalarArrayOpExpr 품질을 처리합니까? */
    bool amsearcharray;
    /* AM은 IS NULL/IS NOT NULL 한정자를 처리합니까? */
    bool amsearchnulls;
    /* 인덱스 저장 데이터 유형이 열 데이터 유형과 다를 수 있습니까? */
    부울 저장;
    /* 이 유형의 인덱스를 클러스터링할 수 있습니까? */
    bool 클러스터 가능;
    /* AM이 조건자 잠금을 처리합니까? */
    부울 앰프록;
    /* AM은 병렬 스캔을 지원합니까? */
    bool amcanparallel;
    /* AM은 INCLUDE 절에 포함된 열을 지원합니까? */
    bool amcaninclude;
    /* AM은maintenance_work_mem을 사용합니까? */
    bool amusemaintenanceworkmem;
    /* 병렬 진공 플래그의 OR */
    uint8개의 병렬진공 옵션;
    /* 인덱스에 저장된 데이터 유형 또는 변수인 경우 InvalidOid */
    Oid amkeytype;

    /* 인터페이스 함수 */
    ambuild_function ambuild;
    ambuildempty_function ambuildempty;
    aminsert_function aminsert;
    ambulkdelete_function ambulkdelete;
    amvacuumcleanup_function amvacuumcleanup;
    amcanreturn_function amcanreturn;   /* NULL일 수 있음 */
    amcostestimate_function amcostestimate;
    amoptions_function amoptions;
    amproperty_function amproperty;     /* NULL일 수 있음 */
    ambuildphasename_function ambuildphasename;   /* NULL일 수 있음 */
    amvalidate_function amvalidate;
    amadjustmembers_function amadjustmembers; /* NULL일 수 있음 */
    ambeginscan_function ambeginscan;
    amrescan_function amrescan;
    amgettuple_function amgettuple;     /* NULL일 수 있음 */
    amgetbitmap_function amgetbitmap;   /* NULL일 수 있음 */
    amendscan_function 수정 스캔;
    ammarkpos_function ammarkpos;       /* NULL일 수 있음 */
    amrestrpos_function amrestrpos;     /* NULL일 수 있음 */

    /* 병렬 인덱스 스캔을 지원하는 인터페이스 함수 */
    amestimateparallelscan_function amestimateparallelscan;    /* NULL일 수 있음 */
    aminitparallelscan_function aminitparallelscan;    /* NULL일 수 있음 */
    amparallelrescan_function amparallelrescan;    /* NULL일 수 있음 */
 IndexAmRoutine;

유용하려면 색인 액세스 방법에도 하나 이상이 있어야 합니다.운영자 가족그리고연산자 클래스다음에 정의됨pg_opfamily, pg_opclass, pg_amoppg_amproc. 이러한 항목을 통해 계획자는 이 액세스 방법의 색인과 함께 사용할 수 있는 쿼리 제한의 종류를 결정할 수 있습니다. 연산자 계열 및 클래스는 다음에 설명되어 있습니다.PostgreSQL : 문서 : 15 : 38.16. 와이즈 토토에 대한 확장 인터페이스, 이 장을 읽기 위한 전제 자료입니다.

개별 색인은 다음에 의해 정의됩니다.pg_class물리적 관계로 설명하는 항목과 apg_index인덱스의 논리적 내용, 즉 인덱스가 가지고 있는 인덱스 열 집합과 관련 연산자 클래스에서 캡처한 해당 열의 의미를 표시하는 항목입니다. 인덱스 열(키 값)은 기본 테이블의 단순 열이거나 테이블 행에 대한 표현식일 수 있습니다. 인덱스 액세스 방법은 일반적으로 인덱스 키 값이 어디에서 왔는지에 관심이 없지만(항상 미리 계산된 키 값을 전달함) 연산자 클래스 정보에는 매우 관심이 있습니다.pg_index. 이 두 카탈로그 항목은 모두 다음의 일부로 액세스할 수 있습니다.관계색인의 모든 작업에 전달되는 데이터 구조.

플래그 필드 중 일부IndexAmRoutine명백하지 않은 의미가 있습니다. 요구 사항amcanunique에서 논의됨Postgresql: Tài liệu: 15: 64.5. 메이저 토토 사이트ỉ mục kiểm tra tính duy nhất.amcanmulticol플래그는 액세스 방법이 다중 키 열 인덱스를 지원한다고 주장하는 반면amOptionalkey첫 번째 토토 캔 열에 대해 토토 캔 가능 제한 조항이 제공되지 않은 스캔을 허용한다고 주장합니다. 언제amcanmulticol거짓입니다,amOptionalkey기본적으로 액세스 방법이 제한 조항 없이 전체 인덱스 스캔을 지원하는지 여부를 나타냅니다. 여러 인덱스 열을 지원하는 액세스 방법반드시첫 번째 열 이후의 일부 또는 전체 열에 대한 제한 사항을 생략하는 검색을 지원합니다. 그러나 첫 번째 인덱스 열에 표시하기 위해 몇 가지 제한 사항을 요구할 수 있으며 이는 설정으로 표시됩니다.amOptionalkey거짓. 토토 캔 AM이 설정할 수 있는 한 가지 이유amOptionalkeyfalse는 null 값을 색인화하지 않는 경우입니다. 대부분의 인덱싱 가능한 연산자는 엄격하므로 null 입력에 대해 true를 반환할 수 없으므로 얼핏 보면 null 값에 대한 인덱스 항목을 저장하지 않는 것이 매력적입니다. 어차피 인덱스 스캔에서는 절대 반환할 수 없습니다. 그러나 인덱스 스캔에 지정된 인덱스 열에 대한 제한 조항이 없으면 이 인수는 실패합니다. 실제로 이는 다음과 같은 인덱스가 있음을 의미합니다.amOptionalkeytrue는 null을 색인화해야 합니다. 플래너가 스캔 키가 전혀 없는 색인을 사용하기로 결정할 수 있기 때문입니다. 관련 제한 사항은 여러 인덱스 열을 지원하는 인덱스 액세스 방법입니다.반드시첫 번째 열 이후의 열에서 null 값 인덱싱을 지원합니다. 왜냐하면 플래너는 해당 열을 제한하지 않는 쿼리에 인덱스를 사용할 수 있다고 가정하기 때문입니다. 예를 들어 (a,b)에 대한 인덱스와a = 4인 곳. 시스템은 토토 캔를 사용하여 행을 검색할 수 있다고 가정합니다.a = 4, 색인이 행을 생략하는 경우 잘못된 것입니다.b널입니다. 그러나 첫 번째 인덱싱된 열이 null인 행을 생략하는 것은 괜찮습니다. null 토토 캔를 수행하는 토토 캔 액세스 방법도 설정할 수 있습니다.amsearchnulls, 지원함을 나타냄NULL임그리고NULL이 아닙니다절을 검색 조건으로 사용합니다.

amcaninclude플래그는 액세스 방법이 지원하는지 여부를 나타냅니다.포함열, 즉 키 열 외에 추가 열을 (처리하지 않고) 저장할 수 있습니다. 이전 단락의 요구 사항은 키 열에만 적용됩니다. 특히, 다음의 조합은amcanmulticol=거짓그리고amcaninclude=합리적입니다. 이는 하나의 키 열만 있을 수 있지만 포함된 열도 있을 수 있음을 의미합니다. 또한 포함된 열은 다음과 관계없이 null이 허용되어야 합니다.amOptionalkey.

수정사항 제출

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