PostgreSQL | ||
---|---|---|
이전 | 다음 |
지금까지 설명한 절차로 새로운 유형을 정의 할 수 있습니다. 기능 및 신규 운영자. 그러나 우리는 아직 a를 정의 할 수 없습니다 2 차 지수 (예 : B- 트리, R- 트리 또는 해시 액세스 스포츠 토토) 새로운 유형 또는 운영자를 통해.
되돌아 보면주요 Postgres 시스템 카탈로그. 오른쪽 절반은 Postgres를 사용하는 스포츠 토토을 알려주기 위해 수정 해야하는 카탈로그 인덱스가있는 사용자 정의 유형 및/또는 사용자 정의 연산자 (즉.,pg_am, pg_amop, pg_amprocandpg_opclass). 불행히도, 아무도 없습니다 이것을하는 간단한 명령. 우리는 이것을 수정하는 스포츠 토토을 보여줄 것입니다 실행중인 예제를 통해 카탈로그 : 새로운 운영자 클래스 오름차순으로 정수를 정렬하는 B- 트리 액세스 스포츠 토토 가치 순서.
thePG_AM클래스에는 하나의 인스턴스가 포함됩니다 모든 사용자 정의 액세스 방법에 대해. 힙 액세스 지원 메소드는 Postgres에 내장되어 있지만 다른 모든 액세스 방법은 다음과 같습니다. 여기에 설명되어 있습니다. 스키마는
표 35-1. 인덱스 스키마
속성 | 설명 |
---|---|
Amname | 액세스 스포츠 토토의 이름 |
Amowner | 소유자의 객체 ID pg_user의 인스턴스 |
Amkind | 현재 사용되지 않았지만 'O'는 장소 보유자 |
AMSTROGRAGES | 이것에 대한 전략 수 액세스 스포츠 토토 (아래 참조) |
amsupport | 지원 루틴 수 이 액세스 스포츠 토토 (아래 참조) |
AmgetTuple Aminsert ... | 절차 식별자 액세스 스포츠 토토에 대한 인터페이스 루틴. 예를 들어, regproc 개방, 폐쇄 및 인스턴스를위한 ID 액세스 스포츠 토토이 여기에 나타납니다. |
인스턴스의 객체 IDPG_AM는 많은 다른 클래스에서 외국 키로 사용됩니다. 당신은 필요하지 않습니다 이 클래스에 새 인스턴스를 추가하려면; 당신이 관심있는 것은 확장하려는 액세스 메소드 인스턴스의 객체 ID :
pg_am에서 OID를 선택하여 Amname = 'btree'; +----+ | OID | +----+ | 403 | +----+
theamstrateing속성이 존재합니다 데이터 유형에서 비교를 표준화하십시오. 예를 들어, B- 트리 키에 대한 엄격한 순서를 부과합니다. Postgres 이후 사용자가 연산자를 정의 할 수있게하고 Postgres는 연산자 이름 (예 : ""또는 "<")의 이름을 알려주고 어떤 종류의 비교입니다. 실제로 일부 액세스 방법은 적을 수 없습니다 전혀 주문. 예를 들어, R- 트리가 a 해시 데이터 구조는 사각형 함유 관계 해시의 값에 따라 비트 유사성 만 표현합니다. 기능. Postgres는 일관된 방법이 필요합니다 쿼리의 자격, 운영자를보고 사용 가능한 색인이 있는지 결정합니다. 이것은 Postgres가 필요하다는 것을 의미합니다 예를 들어 "<="및 ""연산자가 B- 트리를 분할하십시오. Postgres는 전략을 사용하여이를 표현합니다 연산자와 사용 할 수있는 방법 간의 관계 스캔 지수.
새로운 전략 세트 정의는 이것의 범위를 벗어납니다. 토론, 그러나 우리는 B- 트리 전략이 어떻게 작동하는지 설명합니다 새 운영자 클래스를 추가하려면이를 알아야합니다. 에서PG_AM클래스, amstrategies 속성 이 액세스 방법에 대해 정의 된 전략 수입니다. 을 위한 B- 트리,이 숫자는 5입니다.이 전략은에 해당합니다.
표 35-2. B- 트리 전략
작동 | index |
---|---|
1 | |
작거나 평등 한 | 2 |
Equal | 3 |
더 크거나 평등 | 4 |
보다 | 5 |
아이디어는 다음과 같은 절차를 추가해야한다는 것입니다. 위의 비교pg_amop관계 (아래 참조). 액세스 스포츠 토토 코드는 이러한 전략을 사용할 수 있습니다 파티션 스포츠 토토을 알아 내기 위해 데이터 유형에 관계없이 숫자 B- 트리, 선택성을 계산하는 등. 걱정하지 마십시오 절차 추가에 대한 세부 사항; 그냥 이해해야한다는 것을 이해하십시오 에 대한 이러한 절차 세트가 되십시오.int2, int4, OID,및 B- 트리가 작동 할 수있는 다른 모든 데이터 유형. 때로는 전략이 시스템에 대한 정보가 충분하지 않습니다 인덱스 사용 방법을 알아냅니다. 일부 액세스 방법에는 다른 액세스 방법이 필요합니다 일하기 위해 루틴을 지원합니다. 예를 들어, B- 트리 액세스 메소드는 두 개의 키를 비교하고 하나의 키를 결정할 수 있어야합니다. 다른 것보다 더 크거나 동일합니다. 마찬가지로 R- 트리 액세스 방법은 교차로, 노조를 계산할 수 있어야합니다. 사각형의 크기. 이러한 작업은 사용자와 일치하지 않습니다 SQL 쿼리의 자격; 그들은 행정 루틴입니다 내부적으로 액세스 방법에 사용됩니다.
다양한 지원 루틴을 지속적으로 관리하기 위해 모든 Postgres 액세스 스포츠 토토,PG_AM라는 속성 포함amsupport. 이 속성은 액세스 방법. B- 트리의 경우이 숫자는 하나입니다. 두 개의 키를 가져 와서 첫 번째 키는 두 번째 키보다 적거나 큽니다.
참고 :엄격히 말하면,이 루틴은 a를 반환 할 수 있습니다 음수 (<0), 0 또는 0이 아닌 양수 ( 0).
theamstrategiesPG_AM의 입장 액세스 방법에 대해 정의 된 전략 수 질문. 적은 수준, 덜 평등 한 등의 절차는 에 나타납니다.PG_AM. 비슷하게,amsupport는 지원 루틴의 수입니다 액세스 스포츠 토토에 필요합니다. 실제 루틴이 나열됩니다 다른 곳.
다음 관심 분야는 pg_opclass입니다. 이 수업은 만 존재합니다 이름을 OID와 연결합니다. PG_AMOP에서는 모든 B- 트리 연산자입니다 클래스에는 위의 일련의 절차가 있습니다. 일부 기존의 OPClass는int2_ops, int4_ops 및 oid_ops. opclass 이름으로 인스턴스를 추가해야합니다. (예를 들어,complex_abs_ops) topg_opclass. 그만큼OID이 인스턴스의 외국 키입니다 수업.
pg_opclass (opcname) 값 ( 'complex_abs_ops')에 삽입; OID, OpcName을 선택하십시오 pg_opclass에서 여기서 opcname = 'complex_abs_ops'; +------+-------------+ | OID | opcname | +------+-------------+ | 17314 | int4_abs_ops | +------+------------+당신의 OID에 주목하십시오pg_opclass인스턴스가 다릅니다! 당신은해야합니다 17314 년에 당신의 가치를 대체하십시오. 논의.
이제 액세스 방법과 연산자 클래스가 있습니다. 우리는 여전히 운영자 세트가 필요합니다. 운영자를 정의하는 절차 이 매뉴얼의 앞부분에서 논의되었습니다. complex_abs_ops 연산자 용 Btrees에 대한 클래스, 우리가 필요로하는 운영자는 다음과 같습니다.
절대 값보다 낮습니다 절대 값은 적거나 평등하지 않습니다 절대 값은 동일합니다 절대 값은 평등 한 것보다 더 큰 값입니다 절대 가치보다 큰
정의 된 함수를 구현하는 코드가 저장되어 있다고 가정합니다. 파일에서pgroot/src/튜토리얼/complex.c
코드의 일부는 다음과 같습니다. 나머지 예제의 평등 연산자. 다른 4 명 연산자는 매우 유사합니다. 참조complex.c또는complex.sql세부 사항은.)
#define mag (c) ((c)- x*(c)- x + (c)- y*(c)- y) 부 complex_abs_eq (complex *a, complex *b) Double Amag = mag (a), bmag = mag (b); return (amag == bmag);
일어나고있는 몇 가지 중요한 일이 있습니다. 아래에.
먼저, 작전은 적거나 덜 평등 한 운영자, 동등하고, 평등하거나, 평등하며,보다int4정의 중입니다. 이 모든 운영자가 있습니다 이미 정의int4이름 아래 <, <=, =, = 및. 새로운 운영자가 행동합니다 물론 다르게. Postgres가 사용하는 것을 보장하기 위해 이 새로운 운영자는 오래된 운영자보다는 이름을 지어야합니다. 오래된 것과 다르게. 이것은 핵심 요점입니다 Postgr에서 오퍼레이터를 과부하하지만 운영자가 아닌 경우에만 인수 유형에 대해 이미 정의되었습니다. 즉, 당신이 <가 있다면 (int4, int4)로 정의되면 다시 정의 할 수 없습니다. Postgres가합니다 연산자를 정의 할 때 확인하지 마십시오. 조심하십시오. 에게 이 문제를 피하면 연산자에게 이상한 이름이 사용됩니다. 만약에 당신은 이것을 잘못 이해할 때 액세스 방법이 충돌 할 가능성이 높습니다. 스캔을 시도하십시오.
다른 중요한 점은 모든 운영자가 기능한다는 것입니다. 부울 값을 반환합니다. 액세스 방법은이 사실에 의존합니다. (에 다른 한편으로, 지원 함수는 무엇이든 반환합니다 특정 액세스 방법은 기대합니다 -이 경우 서명 된 정수.) 파일의 최종 루틴은 "지원 루틴"입니다. 우리가 amsupport 속성에 대해 논의했을 때 언급PG_AM클래스. 나중에 이것을 사용할 것입니다. 지금은 무시합니다.
함수 만들기 complex_abs_eq (복잡하고 복잡한) Bool을 반환합니다 'pgroot/튜토리얼/obj/complex.so'로 언어 'C';
이제 사용하는 연산자를 정의하십시오. 언급 한 바와 같이, 운영자 이름은 2 번을 취하는 모든 연산자 중에서 독특해야합니다.int4오페라. 연산자가 있는지 확인하기 위해 아래에 나열된 이름은 찍히고 쿼리를 할 수 있습니다pg_operator:
/* *이 쿼리는 정규 표현 연산자 (~)를 사용합니다. * 끝나는 3 자 연산자 이름을 찾으려면 * 캐릭터 & */ 선택하다 * pg_operator에서 여기서 oprname ~ '^.. & $':: 텍스트;
원하는 유형에 대한 이름이 찍힌 지 확인하십시오. 그만큼 중요한 것은 절차입니다 (이것은 C 함수입니다. 위에서 정의) 및 제한 및 조인 선택성 함수. 아래에 사용 된 것만 사용해야합니다. 덜, 평등하고 더 큰 기능에 대한 다른 기능 케이스. 이들은 공급해야합니다. 그렇지 않으면 액세스 방법이 충돌합니다. 연산자를 사용하려고합니다. 이름을 복사해야합니다 제한 및 가입이지만 정의한 절차 이름을 사용하십시오. 마지막 단계.
create operator = ( leftarg = complex, rightarg = complex, 절차 = complex_abs_eq, 제한 = eqsel, join = eqjoinsel )
5 명의 운영자가 적은, 덜 동일하며, 동일하고, 더 크고, 더 큰 평등이 정의됩니다.
우리는 거의 끝났습니다. 우리가해야 할 마지막 일은 업데이트pg_amop관계. 이를 위해 다음 속성이 필요합니다.
표 35-3.PG_AMPROC스키마
속성 | 설명 |
---|---|
amopid | theOID의PG_AMb- 트리의 인스턴스 (== 403, 위 참조) |
AMOPCLAID | theOID의pg_opclass인스턴스int4_abs_ops(== 대신 무엇이든17314, 위 참조) |
amopop | theOIDopclass (who)의 연산자 우리는 단지 1 분 안에 갈거야) |
amopselect, amopnpages | 비용 함수 |
그래서 우리는 필요합니다OID우리는 방금 정의했습니다. 우리는 모든 운영자의 이름을 찾아 볼 것입니다. 두 번 가져 가라int4s, 그리고 우리를 골라냅니다 :
O.Oid를 Opoid, O.Oprname으로 선택합니다 테이블에 complex_ops_tmp pg_operator o, pg_type t에서 여기서 o.oprleft = t.oid 및 o.oprright = t.oid 및 t.typname = 'complex'; +------+--------+ | OID | oprname | +------+--------+ | 17321 | <| +------+--------+ | 17322 | <= | +------+--------+ | 17323 | = | +------+--------+ | 17324 | = | +------+--------+ | 17325 | | +------+--------+(다시, 일부OID숫자 거의 확실하게 다를 것입니다.) 우리는 운영자입니다 관심이있는 사람은OIDS 17321 17325 년까지. 당신이 얻는 가치는 아마도 다를 것입니다. 아래 값으로 대체해야합니다. 우리는 볼 수 있습니다 운영자 이름과 방금 추가 한 이름을 골라냅니다.
이제 업데이트 할 준비가되었습니다PG_AMOP우리의 새로운 운영자 수업. 이 전체에서 가장 중요한 것 토론은 운영자가 덜 동일하게 주문된다는 것입니다. 더 큰 평등을 통해pg_amop. 우리는 추가합니다 필요한 인스턴스 :
pg_amop에 삽입 (amopid, amopclaid, amopop, amopstrategy, amopselect, amopnpages) am.oid, opcl.oid, c.opoid, 3, 선택을 선택하십시오. 'btreesel':: regproc, 'btreenpage':: regproc PG_AM AM, PG_OPCLASS OPCL, COMPLED_OPS_TMP C. 여기서 Amname = 'btree' 그리고 opcname = 'complex_abs_ops' 그리고 c.oprname = '=';순서 : "보다 작거나", "이상 또는 동일"은 2, "동등한"은 3, "더 크거나 동일"은 4이고 "보다 크다" 5.
마지막 단계 (마지막으로!)는 "지원 등록입니다 일상적인 "이전에 묘사 된PG_AM. 그만큼OID지원 루틴은에 저장됩니다.PG_AMPROC클래스, 액세스 스포츠 토토에 의해 키워OID및 연산자 클래스OID. 먼저 함수를 등록해야합니다 Postgres (우리는 이것을 구현하는 C 코드를 넣었다는 것을 기억합니다. 우리가 구현 한 파일 하단의 일상 연산자 루틴) :
함수 생성 int4_abs_cmp (int4, int4) int4를 반환합니다 'pgroot/튜토리얼/obj/complex.so'로 언어 'c'; PG_PROC에서 OID, Proname을 선택하십시오 여기서 prname = 'int4_abs_cmp'; +------+-------------+ | OID | 프로 이름 | +------+-------------+ | 17328 | int4_abs_cmp | +------+------------+(다시, 당신의OID번호가 있습니다 아마도 다르고 당신이 보는 가치를 대체해야합니다. 아래 값의 경우.) B-Tree 인스턴스의 OID가 403 및int4_abs_ops는 17314입니다 다음과 같이 새 인스턴스를 추가 할 수 있습니다.
pg_amproc에 삽입 (AmopClaid, amproc, amprocnum) 값 ( '403':: oid, - btree oid '17314':: oid, -pg_opclass 튜플 '17328':: OID, - 새로운 PG_PROC OID '1':: int2);
이전 | 홈 | 다음 |
SQL 확장 : 집계 | up | Gist Indices |