이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 36.16. 토토 핫에 대한 확장 인터페이스버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

44 장. 인터페이스 확장 지표

지금까지 설명한 절차로 새로운 유형을 정의 할 수 있습니다. 기능 및 신규 운영자. 그러나 우리는 아직 a를 정의 할 수 없습니다 2 차 지수 (예 :B-Tree, R-Tree또는 해시 액세스 사설 토토 사이트)를 통해 새로운 유형 또는 운영자.

되돌아 보면주요 Postgres 시스템 카탈로그. 오른쪽 절반은 우리가 수정 해야하는 카탈로그를 보여줍니다. 말하기 위해Postgres사설 토토 사이트 인덱스와 함께 사용자 정의 유형 및/또는 사용자 정의 연산자를 사용하십시오. (즉.,pg_am, pg_amop, pg_amprocandpg_opclass). 불행히도, 아무도 없습니다 이것을하는 간단한 명령. 우리는 이것을 수정하는 사설 토토 사이트을 보여줄 것입니다 실행중인 예제를 통해 카탈로그 : 새로운 운영자 클래스B-Tree정렬 된 액세스 사설 토토 사이트 오름차순 절대 가치 순서의 정수.

thePG_AM클래스에는 하나의 인스턴스가 포함됩니다 모든 사용자 정의 액세스 방법에 대해. 힙 액세스 지원 메소드가 내장되어 있습니다Postgres그러나 다른 모든 액세스 사설 토토 사이트은 여기에 설명되어 있습니다. 스키마는

표 44-1. 인덱스 스키마

속성 설명
Amname 액세스 사설 토토 사이트의 이름
Amowner 소유자의 객체 ID pg_user의 인스턴스
Amkind 현재 사용되지 않지만 설정 'O'는 장소 보유자
amstrateing 이것에 대한 전략 수 액세스 사설 토토 사이트 (아래 참조)
amsupport 지원 루틴 수 이 액세스 방법 (아래 참조)
AmgetTuple Aminsert ... 절차 식별자 액세스 사설 토토 사이트에 대한 인터페이스 루틴. 예를 들어, regproc 개방, 폐쇄 및 인스턴스를위한 ID 액세스 사설 토토 사이트이 여기에 나타납니다.

the객체 ID인스턴스의PG_AM는 많은 곳에서 외국 키로 사용됩니다 다른 수업. 이 클래스에 새 인스턴스를 추가 할 필요가 없습니다. 관심있는 것은입니다.개체 ID확장하려는 액세스 메소드 인스턴스의 :

pg_am에서 OID를 선택하여 Amname = 'btree';

         +----+
         | OID |
         +----+
         | 403 |
         +----+

theamstrategies속성이 있습니다 데이터 유형에서 비교를 표준화하십시오. 예를 들어,B-Trees는 엄격한 순서를 부과합니다 키, 더 큰 키. 부터Postgres사용자가 연산자를 정의 할 수 있습니다.Postgres이름을 볼 수 없습니다 연산자 (예 : ""또는 "<")의 비교입니다. 실제로 일부 액세스 사설 토토 사이트은 적을 수 없습니다 전혀 주문. 예를 들어,R-Trees 해시 데이터는 사각형 함유 관계를 표현합니다 구조는 해시 기능.Postgres일부가 필요합니다 쿼리에서 자격을 취하는 일관된 사설 토토 사이트 연산자가 사용 가능한 색인이 있는지 결정합니다. 이것 암시한다Postgres필요합니다 예를 들어, "<="및 ""연산자 파티션이 있음을 알고 있습니다. 에이B-Tree. Postgres전략을 사용하여이를 표현합니다 연산자와 사용 할 수있는 사설 토토 사이트 간의 관계 스캔 지수.

새로운 전략 세트 정의는 이것의 범위를 벗어납니다. 토론, 그러나 우리는 방법을 설명 할 것입니다B-Tree전략은 알아야하기 때문에 작동합니다 새로운 운영자 클래스를 추가합니다. 에서PG_AM클래스, amstrategies 속성은입니다 이 액세스 방법에 정의 된 전략 수. 을 위한B-Trees,이 숫자는 5입니다 전략은에 해당합니다.

표 44-2. B- 트리 전략

작동 index
1
작거나 동등한 2
Equal 3
더 크거나 평등 4
보다 5

아이디어는 다음과 같은 절차를 추가해야한다는 것입니다. 위의 비교pg_amop관계 (아래 참조). 액세스 사설 토토 사이트 코드는 이러한 전략을 사용할 수 있습니다 파티션 사설 토토 사이트을 알아 내기 위해 데이터 유형에 관계없이 숫자 그만큼B-Tree, 컴퓨팅 선택성 및 곧. 아직 절차 추가의 세부 사항에 대해 걱정하지 마십시오. 단지 에 대한 이러한 절차 세트가 있어야한다는 것을 이해하십시오.int2, int4, oid,및 다른 모든 데이터 a 유형b-tree작동 할 수 있습니다. 때로는 전략이 시스템에 대한 정보가 충분하지 않습니다 인덱스 사용 방법을 알아냅니다. 일부 액세스 방법에는 다른 액세스 방법이 필요합니다 일하기 위해 루틴을 지원합니다. 예를 들어,B-Tree액세스 방법은 둘을 비교할 수 있어야합니다 열쇠와 하나 이상, 동일 또는 그 이상인지 결정 다른 것보다. 마찬가지로R-Tree액세스 사설 토토 사이트은 교차로, 노동 조합을 계산할 수 있어야합니다. 사각형의 크기. 이러한 작업은 사용자와 일치하지 않습니다 SQL 쿼리의 자격; 그들은 행정 루틴입니다 내부적으로 액세스 사설 토토 사이트에 사용됩니다.

다양한 지원 루틴을 지속적으로 관리하기 위해 모두Postgres액세스 사설 토토 사이트,PG_AM라는 속성 포함amsupport. 이 속성은 액세스 방법에서 사용하는 지원 루틴 수. 을 위한B-Trees,이 숫자는 하나입니다 두 개의 키를 가져 와서 -1, 0 또는 +1을 반환하는 일상 첫 번째 키가 두번째.

참고 :엄격히 말하면,이 루틴은 a를 반환 할 수 있습니다 음수 (<0), 0 또는 0이 아닌 양수 ( 0).

theamstrategiesPG_AM의 입장 액세스 방법에 대해 정의 된 전략 수 질문. 적은 수준, 덜 평등 한 등의 절차는 에 나타납니다.PG_AM. 비슷하게,amsupport는 지원 루틴의 수입니다 액세스 방법에 필요합니다. 실제 루틴이 나열됩니다 다른 곳.

다음 관심 분야는 pg_opclass입니다. 이 수업은 만 존재합니다 이름을 OID와 연결합니다. pg_amop에서 모든B-Tree운영자 클래스에는 일련의 절차가 있습니다 위의 5 개를 통해. 기존의 일부 OPClass는입니다.int2_ops, int4_ops 및 oid_ops. 추가해야합니다 opclass 이름이있는 인스턴스 (예 :complex_abs_ops) topg_opclass. 그만큼OIDOF 이 인스턴스는 다른 클래스의 외국 키입니다.

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이 새로운 연산자를 사용하지 않고 사용합니다 오래된 것들은 오래된 것과 다르게 지명되어야합니다. 이것은 핵심 요점입니다.Postgres그러나 연산자가 아닌 경우에만 인수 유형에 대해 이미 정의되었습니다. 즉, 당신이 <가 있다면 (int4, int4)에 대해 정의하면 다시 정의 할 수 없습니다.Postgres정의 할 때 이것을 확인하지 마십시오 운영자이므로 조심하십시오. 이 문제를 피하기 위해 이상한 이름이 있습니다 연산자에게 사용됩니다. 당신이 이것을 잘못 이해하면 액세스 스캔을 시도 할 때 사설 토토 사이트이 충돌 할 가능성이 높습니다.

다른 중요한 점은 모든 운영자가 기능한다는 것입니다. 부울 값을 반환합니다. 액세스 방법은이 사실에 의존합니다. (에 다른 한편으로, 지원 함수는 무엇이든 반환합니다 특정 액세스 방법은 기대합니다 -이 경우 서명 된 정수.) 파일의 최종 루틴은 "지원 루틴"입니다. 우리가 amsupport 속성에 대해 논의했을 때 언급PG_AM클래스. 나중에 이것을 사용할 것입니다. 지금은 무시합니다.

함수 만들기 complex_abs_eq (complex, complex)
              Bool을 반환합니다
              'pgroot/튜토리얼/obj/complex.so'로
              언어 'C';

이제 사용하는 연산자를 정의하십시오. 언급 한 바와 같이, 운영자 이름은 2 번을 취하는 모든 연산자 중에서 독특해야합니다.int4오페라. 연산자가 있는지 확인하기 위해 아래에 나열된 이름은 찍히고 쿼리를 할 수 있습니다pg_operator:

/*
     *이 쿼리는 정규 표현 연산자 (~)를 사용합니다.
     * 끝나는 3 자 연산자 이름을 찾으려면
     * 캐릭터 &
     */
    선택하다 *
     pg_operator에서
     여기서 oprname ~ '^.. & $':: 텍스트;

원하는 유형에 대한 이름이 찍힌 지 확인하십시오. 그만큼 중요한 것은 절차입니다 (C위에서 정의 된 함수) 및 제한 및 선택성 함수에 가입하십시오. 사용 된 것만 사용해야합니다 아래-그러한 기능은 다른 기능이 있다는 점입니다 덜, 평등하고, 더 큰 경우. 이들은 공급해야합니다. 또는 작업자를 사용하려고 할 때 액세스 방법이 충돌합니다. 제한 및 가입을 위해 이름을 복사해야하지만 사용하십시오. 마지막 단계에서 정의한 절차 이름.

생성 연산자 = (
     leftarg = complex, rightarg = complex,
     절차 = complex_abs_eq,
     제한 = eqsel, join = eqjoinsel
         )

5 명의 운영자가 적은, 덜 평등 한 지 알아 봅니다. 동일하고, 더 크고, 더 큰 평등이 정의됩니다.

우리는 거의 끝났습니다. 우리가해야 할 마지막 일은 업데이트pg_amop관계. 이를 위해 다음 속성이 필요합니다.

표 44-3.PG_AMPROC스키마

속성 설명
amopid theOIDPG_AMb- 트리의 인스턴스 (== 403, 위 참조)
AMOPCLAID theOIDpg_opclass인스턴스int4_abs_ops(== 대신 무엇이든17314, 위 참조)
amopop theOIDopclass (whital of opclass) 우리는 단지 1 분 안에 갈거야)
amopselect, amopnpages 비용 함수
비용 함수는 쿼리 최적화에 의해 사용됩니다. 스캔에서 주어진 인덱스를 사용할지 여부. 다행히도, 이것들 이미 존재합니다. 우리가 사용할 두 가지 기능은입니다.btreesel,의 선택성을 추정합니다B-Treebtreenpage, 페이지 수를 추정 a 검색은 나무에 닿을 것입니다.

그래서 우리는 필요합니다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우리의 새로운 운영자 수업. 이 전체에서 가장 중요한 것 discussion is that the operators are ordered, from less equal 더 큰 평등을 통해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. 먼저, 우리는에 함수를 등록해야합니다.PostgresC이 루틴을 구현하는 코드 운영자를 구현 한 파일의 하단 루틴) :

함수 생성 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_opsIS 17314, 우리는 새로운 것을 추가 할 수 있습니다 다음과 같이 인스턴스 :
pg_amproc에 삽입 (AmopClaid, amproc, amprocnum)
     값 ( '403':: oid, - btree oid
     '17314':: oid, -pg_opclass 튜플
     '17328':: OID, - 새로운 PG_PROC OID
     '1':: int2);