이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 36.14. 사용자 정의 무지개 토토버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

34 장 확장SQL: 배트맨 토토

Postgres좌회전 단제 지원, 우회전 및 이진 배트맨 토토. 배트맨 토토가 과부하 될 수 있습니다. 저것 동일한 배트맨 토토 이름이 다른 배트맨 토토에게 사용될 수 있습니다. 숫자와 인수 유형이 다릅니다. 있는 경우 모호한 상황과 시스템은 올바른 것을 결정할 수 없습니다 사용해야하는 배트맨 토토는 오류를 반환합니다. 당신은 타입 캐스트해야 할 수도 있습니다 왼쪽 및/또는 오른쪽 피배트맨 토토는 어떤 배트맨 토토를 이해하도록 돕습니다. 당신은 사용하려고했습니다.

모든 운영자는 기본 전화를 요청하기 위해 "구문 설탕"입니다. 실제 작업을 수행하는 기능; 따라서 먼저 만들어야합니다 배트맨 토토를 생성하기 전에 기본 기능. 그러나, an 운영자는not단지 구문 설탕, 쿼리에 도움이되는 추가 정보가 제공되기 때문입니다 플래너는 배트맨 토토를 사용하는 쿼리를 최적화합니다. 이것의 대부분 챕터는 추가 설명에 전념 할 것입니다 정보.

다음은 두 추가를위한 연산자를 만드는 예입니다. 복소수. 우리는 이미 정의를 만들었다고 가정합니다 유형 단지. 먼저 작업을 수행하는 기능이 필요합니다. 그럼 우리 연산자를 정의 할 수 있습니다 :

CREATE COMPLET_ADD (Complex, Complex)
    복잡한 반환
    '$ pwd/obj/complex.so'로
    언어 'c';

배트맨 토토 생성 + (
    leftarg = complex,
    rightarg = complex,
    절차 = complex_add,
    통근자 = +
);

이제 우리는 할 수 있습니다 :

test_complex에서 c로 (a + b)를 선택합니다.

+---------------+
| C |
+---------------+
| (5.2,6.05) |
+---------------+
| (133.42,144.95) |
+--------------+

여기에서 이진 배트맨 토토를 만드는 방법을 보여주었습니다. 생성합니다 외교 사업자, 왼쪽 단원 중 하나를 생략하거나 RIGHTRARG (오른쪽 단독). 절차 절과 인수 조항은 운영자를 만드는 유일한 항목입니다. 그만큼 예제에 표시된 정류기 조항은 쿼리 최적화기. 통근자 및 기타에 대한 자세한 내용 최적화 힌트는 아래에 나타납니다.

운영자 최적화 정보

저자 :Tom Lane에 의해 작성되었습니다.

aPostgres운영자 정의 시스템이 유용하다고 알려주는 몇 가지 옵션 조항을 포함시킬 수 있습니다. 운영자의 행동 방식에 대한 것. 이 조항은 있어야합니다 그들이 만들 수 있기 때문에 적절할 때마다 제공됩니다 사용하는 쿼리 실행에있어 상당한 속도 배트맨 토토. 그러나 당신이 그들에게 제공한다면, 당신은 그들이 오른쪽! 최적화 조항을 잘못 사용하면 발생할 수 있습니다 백엔드 충돌, 미묘하게 잘못된 출력 또는 기타 나쁜 것들. 당신은 할 수 있습니다 확실하지 않은 경우 항상 최적화 조항을 제외하십시오. 그것; 유일한 결과는 쿼리가 그들보다 느리게 실행될 수 있다는 것입니다. 필요합니다.

추가 최적화 조항이 향후 추가 될 수 있습니다 버전Postgres. 그들 여기에 설명 된 6.5가 이해하는 모든 것들이 있습니다.

Commutator

제공된 경우 통근자 조항은 운영자의 이름을 지정합니다. 정의되는 배트맨 토토의 정류자. 우리는 그 운영자라고 말합니다 a는 (x a y)가 모두 (y b x) 인 경우 운영자 B의 정류자입니다. 가능한 입력 값 x, y. B는 또한 정류자입니다 A. 예를 들어, 특정의 경우 운영자 '<'및 '' 데이터 유형은 일반적으로 서로의 통근자이며 운영자 '+'는 일반적으로 그 자체로 정류. 그러나 운영자 '-'는 일반적으로 그렇지 않습니다 무엇이든 통근 적.

통근 배트맨 토토의 왼쪽 인수 유형은 정류자의 올바른 인수 유형 및 그 반대도 마찬가지입니다. 그래서 이름 정류자 운영자의 전부Postgres정류자, 그리고 그게 전부입니다. 절.

자기 응고 배트맨 토토를 정의 할 때 그냥 그것. 한 쌍의 정류 배트맨 토토를 정의 할 때는 조금 까다 롭습니다 : 어떻게 정의 될 첫 번째는 어떻게 아직 정의하지 않은 다른 하나는? 두 가지가 있습니다 이 문제에 대한 해결책 :

  • 한 가지 방법은 첫 번째에서 통근자 절을 생략하는 것입니다. 정의한 연산자를 정의한 다음 두 번째로 제공합니다. 운영자의 정의. 부터Postgres정류 배트맨 토토를 알고 있습니다 두 번째 정의를 볼 때 쌍으로 오십시오. 자동으로 돌아가서 누락 된 정류기 조항을 채우십시오. 첫 번째 정의에서.

  • 더 간단한 방법은 단지 포함하는 것입니다 두 정의의 정류기 조항. 언제Postgres첫 번째 정의를 처리합니다 그리고 정류자는 존재하지 않는 배트맨 토토를 언급한다는 것을 알고 있습니다. 시스템은 시스템의 pg_operator 테이블. 이 더미 항목은 유효합니다 운영자 이름, 왼쪽 및 오른쪽 인수 유형에 대해서만 데이터, 그리고 결과 유형, 그게 전부이기 때문에Postgres이 시점에서 추론 할 수 있습니다. 그만큼 퍼스트 오퍼레이터의 카탈로그 항목은이 더미 항목에 연결됩니다. 나중에 두 번째 배트맨 토토를 정의하면 시스템이 업데이트됩니다. 두 번째 추가 정보가 포함 된 더미 항목 정의. 더미 배트맨 토토를 사용하기 전에 채워지면 오류 메시지가 표시됩니다. (참고 : 이것 절차는 안정적으로 작동하지 않았습니다Postgres6.5 이전의 버전이지만 이제 권장하는 일을하는 방법입니다.)

부정관

부정 조항은 제공되는 경우 연산자의 이름을 지정합니다. 정의되는 연산자의 부정. 우리는 운영자 A라고 말합니다 부울 결과와 (X A y) 가능한 모든 입력 x, y에 대해 (x b y)와 동일합니다. B입니다 예를 들어 '<'와 ' ='의 예를 들어 대부분의 데이터 유형에 대한 부정관 쌍. 운영자는 유효성이 없을 수 없습니다 자체 부정관이 되십시오.

정류자와 달리 한 쌍의 단제 배트맨 토토가 유효하게 서로의 부정 자로 표시됩니다. 그것은 (x)가 그렇지 않다는 것을 의미합니다 (B x) 모든 X의 경우 또는 올바른 배트맨 토토의 경우

운영자의 부정자는 동일한 왼쪽 및/또는 오른쪽을 가져야합니다. 인수는 운영자 자체로 유형이므로 정류자와 마찬가지로 부정 조항에 배트맨 토토 이름 만 제공됩니다.

부정기 제공은 쿼리 최적화에 매우 도움이됩니다. x로 단순화하지 않는 (x = y)와 같은 표현식을 허용합니다. < y. 이것은 당신이 생각하는 것보다 더 자주 나타납니다. 왜냐하면 다른 재 배열의 결과로 삽입 할 수 없습니다.

동일한 방법을 사용하여 정의 작업자 쌍을 정의 할 수 있습니다. 정류자 쌍에 대해 위에서 설명했습니다.

제한

제한 조항은 제공된 경우 제한을 지명합니다 연산자의 선택성 추정 기능 (이것은 연산자 이름이 아닌 함수 이름). 조항을 제한합니다 부울을 반환하는 이진 연산자에게 감각. a 제한 선택성 추정기는 테이블의 행은 형태

Field Op Constant
현재 배트맨 토토 및 특정 상수 값의 경우. 이것은 얼마나 많은 행에 대한 아이디어를 제공함으로써 Optimizer를 지원합니다. 이 형식을 가진 조항에 의해 제거 될 것입니다. (무엇 상수가 왼쪽에 있으면 궁금할까요? 잘, 그것은 통근자가위한 것들 중 하나입니다 ...)

새로운 제한 선택성 추정 기능 쓰기는 멀다 이 장의 범위를 넘어서하지만 다행히도 일반적으로 많은 사람들에게 시스템의 표준 추정기 중 하나를 사용합니다. 자신의 운영자. 표준 제한 추정기입니다.

eqsel for =
        neqsel for <
        <또는 <=에 대한 intltsel
         또는 =에 대한 intgtsel
이것이 카테고리라는 것이 조금 이상해 보이지만 당신이 그것에 대해 생각한다면 그들은 의미가 있습니다. '='는 일반적으로 수락합니다 테이블에서 줄의 작은 부분 만; '<'윌 일반적으로 작은 분수 만 거부합니다. '<'는 a를 받아 들일 것입니다 주어진 상수가 어디에 떨어지는 지에 따라 해당 테이블 열의 값 범위 (그렇습니다. 진공 분석에 의해 수집되고 이용할 수있는 정보입니다. 선택성 추정기). '<='는 약간 더 큰 것을 받아들입니다 동일한 비교 상수에 대해 '<'보다 분수이지만 특히 우리가 어쨌든 거친 추측보다 낫지 않을 것입니다. 비슷한 발언 ''및 ' ='에 적용하십시오.

eqsel 또는 neqsel을 사용하여 자주 도망 갈 수 있습니다. 선택성이 매우 높거나 매우 낮은 배트맨 토토의 경우 그들은 실제로 평등이나 불평등이 아닙니다. 예를 들어, 일반 표현 일치 배트맨 토토 (~, ~*등) eqsel을 그들이 보통 작은 부분과 일치 할 것이라고 가정합니다. 테이블의 항목.

Join

조인 절은 제공된 경우 조인트 선택성을 지명합니다 배트맨 토토의 추정 기능 (이것은 기능이라는 점에 유의하십시오. 운영자 이름이 아닌 이름). 조항에 가입하면 만 의미가 있습니다 부울을 반환하는 이진 배트맨 토토. 가입의 아이디어 선택성 추정기는 한 쌍의 테이블은 형태

table1.field1 op table2.field2
현재 연산자의 경우. 제한 조항과 마찬가지로,이 최적화를 알아 낼 수 있도록 도와줍니다. 가능한 몇 가지 조인 시퀀스 중 어느 것이 최소한 일.

이전과 같이,이 장은 결합 선택성 추정기 기능을 작성하지만 제안합니다. 표준 추정기 중 하나를 사용하는 경우 해당되는:

eqjoinsel for =
        <에 대한 Neqjoinsel
        <또는 <=에 대한 intltjoinsel
         또는 =에 대한 intgtjoinsel

해시

해시 조항은 존재하는 경우 시스템에 괜찮다고 말합니다. 해시 조인 메소드를 사용 하여이 연산자를 기반으로 조인을 사용하십시오. 해시 부울을 반환하는 이진 연산자에게만 적합합니다. 연습 연습자는 일부 데이터에 대한 평등이 더 좋았습니다. 유형.

해시 조인의 기본 가정은 조인 연산자가 해시가하는 왼쪽 및 오른쪽 값 쌍에 대해서만 진정으로 반환 할 수 있습니다. 동일한 해시 코드에. 두 값이 다른 해시에 넣는 경우 버킷, 결합은 암시 적으로 전혀 비교하지 않습니다. 조인 연산자의 결과가 거짓이어야한다고 가정합니다. 그래서 그렇지 않은 연산자에 해시를 지정하는 것이 의미가 없습니다. 평등을 대표합니다.

실제로 논리적 평등도 충분하지 않습니다. 그만큼 운영자는 순수한 비트 동등성을 더 잘 표현했습니다 해시 함수는 비트의 의미에 관계없이 값. 예를 들어, 평등 시간 간격은 약간의 평등이 아닙니다. 간격 평등 연산자는 두 시간 간격이 동일하게 동일하다고 생각합니다. 엔드 포인트가 동일하든 기간. 이게 구간 필드간에 "="를 사용하는 조인은 구현 된 경우보다 해시 조인으로 구현 된 경우 다른 결과 다른 방법으로, 쌍의 큰 부분이 일치하는 일치는 다른 값으로 해시되며 결코 비교되지 않습니다. 해시 가입. 그러나 최적화가 다른 종류를 사용하기로 선택했다면 평등 연산자가 말하는 모든 쌍은 동일합니다. 발견됩니다. 우리는 그런 종류의 불일치를 원하지 않습니다 간격 평등을 해시 가능으로 표시하지 마십시오.

해시 조인이 할 수있는 기계 의존적 방법도 있습니다. 옳은 일을하지 못합니다. 예를 들어, 데이터 유형이 a 흥미롭지 않은 패드 비트가있을 수있는 구조, 안전하지 않습니다. 평등 연산자 해시를 표시합니다. (아마도 당신이 글을 쓰지 않는 한 사용하지 않은 비트가 항상 0.) 또 다른 예는 플로트 데이터 유형이 안전하지 않다는 것입니다. 해시 가입. IEEE 플로팅 포인트 표준을 충족하는 기계에서 마이너스 0과 플러스 0은 다른 값입니다 (다른 비트 패턴) 그러나 동일하게 비교하도록 정의됩니다. 그래서, 플로트 평등은 해시, 마이너스 0 및 플러스 0으로 표시되었습니다. 아마도 해시 조인과 일치하지는 않지만 다른 조인 프로세스와 일치합니다.

결론은 아마도 해시 만 사용해야한다는 것입니다. 평등 운영자 (또는 또는)에 의해 구현 될 수 있습니다 memcmp ().

Sort1 and Sort2

정렬 조항은 시스템에 시스템에 그것이 합병 결합 메소드를 사용하는 것이 허용됩니다. 현재 운영자. 두 사람이라면 둘 다 지정해야합니다. 전류 운영자는 일부 데이터 유형에 대한 평등이어야하며 Sort1 및 Sort2 Clauses의 이름 순서 배트맨 토토 ( '<' 배트맨 토토) 각각 왼쪽 및 오른쪽 데이터 유형의 경우.

병합 조인 오른쪽 테이블을 순서대로 한 다음 병렬로 스캔합니다. 그래서, 두 데이터 유형 모두 완전히 주문할 수 있어야하며 가입 연산자는 값 쌍에 대해서만 성공할 수있는 연산자 여야합니다. 정렬 순서의 "동일한 장소"에 가을. 실제로 이것 가입 연산자가 평등처럼 행동해야 함을 의미합니다. 그러나와는 달리 왼쪽 및 오른쪽 데이터 유형이 더 나은 곳에있는 Hashjoin 동일 (또는 적어도 비트 동등한), 합병 할 수 있습니다. 논리적으로 호환되는 한 두 가지 별개의 데이터 유형. 예를 들어, Int2-Versus-Int4 Equality Operator는 다음과 같습니다 합병 가능. 우리는 두 가지를 가져올 정렬 연산자 만 있으면됩니다 논리적으로 호환 가능한 순서로 데이터 타입.

병합 정렬 연산자, 현재 연산자 및 두 참조 된 운영자는 부울을 반환해야합니다. Sort1 연산자 두 입력 데이터 유형 모두 현재 연산자의 왼쪽과 동일한 데 있어야합니다. 인수 유형 및 Sort2 연산자는 두 입력이 있어야합니다. 데이터 유형은 현재 연산자의 올바른 인수 유형과 같습니다. (처럼 정류자와 부정관을 사용하면 운영자 이름이 연산자를 지정하기에 충분하고 시스템이 만들 수 있습니다. 평등을 정의하는 경우 더미 운영자 항목 다른 사람 앞에서 운영자.)

실제로 '='에 대한 정렬 조항 만 작성해야합니다. 배트맨 토토와 두 참조 작업자의 이름은 항상 '<'. 다른 이름의 배트맨 토토와 합병 조인을 사용하려고 우리가 볼 수있는 이유 때문에 희망없는 혼란을 초래할 것입니다. 순간.

표시하는 연산자에 대한 추가 제한이 있습니다 합병 가능. 이러한 제한은 현재 확인되지 않습니다 운영자를 생성하지만 런타임에 병합 조인이 실패 할 수 있습니다. 사실이 아닙니다 :

  • 병합 합류 가능한 평등 배트맨 토토에게는 정류자가 있어야합니다 (두 개의 데이터 유형이 동일하거나 관련된 경우 자체 평등 조작자가 다르면).

  • 주문 배트맨 토토가있는 '<'및 ''가 있어야합니다 병합 합병과 동일한 왼쪽 및 오른쪽 입력 데이터 유형 운영자 자체. 이 배트맨 토토필수'<'및 ''라는 이름을 지정해야합니다. 당신은 선택의 여지가 없습니다 문제를 지정할 조항이 없기 때문에 중요합니다 명시 적으로. 왼쪽 및 오른쪽 데이터 유형이 다르게,이 배트맨 토토 중 어느 것도와 동일하지 않습니다. 정렬 작업자. 그러나 그들은 데이터 값을 더 잘 주문했습니다 정렬 배트맨 토토와 호환되거나 Mergejoin이 실패합니다. 일하다.