각 색인 액세스 방법은 다음 행으로 설명됩니다.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_amop및pg_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.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.