Postgres좌회전 단제 지원, 우회전 및 이진 윈 토토. 윈 토토가 과부하 될 수 있습니다. 즉, 동일한 윈 토토 이름이 다른 경우 사용될 수 있습니다. 숫자와 인수 유형이 다른 윈 토토. 만약에 모호한 상황이 있으며 시스템은 결정할 수 없습니다. 사용하기에 올바른 윈 토토가 오류를 반환합니다. 당신은 할 수 있습니다 도움을주기 위해 왼쪽 및/또는 오른쪽 피윈 토토를 타이핑해야합니다. 어떤 윈 토토를 사용하려고했는지 이해합니다.
모든 운영자는 "구문 설탕"입니다. 실제 작업을 수행하는 기본 기능; 그래서 당신은 먼저해야합니다 당신이 만들기 전에 기본 함수를 만듭니다 윈 토토. 그러나 운영자는not추가 정보를 가지고 있기 때문에 단지 구문 설탕 쿼리 플래너가 사용하는 쿼리를 최적화하는 데 도움이됩니다. 윈 토토. 이 장의 대부분은 추가 정보.
다음은 두 추가를위한 연산자를 만드는 예입니다. 복소수. 우리는 이미 정의를 만들었다고 가정합니다 유형의 단지. 먼저 작업을 수행하는 기능이 필요합니다. 그런 다음 연산자를 정의 할 수 있습니다.
함수 만들기 complex_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를 릴리스합니다 이해합니다.
제공된 경우 통근자 조항은 운영자의 이름을 지정합니다 운영자의 정류자가 정의되는 것입니다. 우리는 그렇게 말합니다 윈 토토 a는 (x a y)와 같은 운영자 B의 정류자입니다. (y b x) 가능한 모든 입력 값 x, y에 대해. B입니다 예를 들어, 운영자 < '및 ''특정 데이터 유형의 경우 일반적으로 서로입니다. ' 통근자와 운영자 '+'는 일반적으로 통근 적입니다 그 자체. 그러나 운영자 '-'는 일반적으로 통근하지 않습니다 아무것.
통근 윈 토토의 왼쪽 인수 유형은 동일합니다. 정류자의 올바른 인수 유형으로, 그 반대도 마찬가지입니다. 그래서 정류자 운영자의 이름이 그 모든 것입니다Postgres제공해야합니다 정류자를 찾아 보려면 그게 전부입니다. 정류자 조항에 제공됩니다.
자체 관리 윈 토토를 정의 할 때, 당신 그냥 해요. 한 쌍의 정류를 정의 할 때 운영자, 물건은 조금 까다 롭습니다. 첫 번째는 어떻게 정의 될 하나는 다른 하나를 가리 킵니다. 아직 정의 되었습니까? 이 문제에 대한 두 가지 해결책이 있습니다.
한 가지 방법은 첫 번째에서 정류기 조항을 생략하는 것입니다. 당신이 정의한 연산자를 정의 한 다음 하나를 제공합니다. 두 번째 운영자의 정의. 부터Postgres그 정류를 알고 있습니다 윈 토토는 두 번째를 볼 때 쌍으로옵니다 정의는 자동으로 돌아가서 첫 번째 정의에서 정류기 조항 누락.
더 간단한 방법은 단지 포함하는 것입니다 두 정의의 정류기 조항. 언제Postgres첫 번째를 처리합니다 정의 및 통근자가 존재하지 않는 윈 토토 인 시스템은 더미에 입력합니다 시스템의 PG_OPERATOR 테이블의 해당 윈 토토. 이것 더미 항목에는 운영자에 대해서만 유효한 데이터가 있습니다. 이름, 왼쪽 및 오른쪽 인수 유형 및 결과 유형, 그게 다야Postgres이 시점에서 추론 할 수 있습니다. 첫 번째 운영자의 카탈로그 항목이 이에 연결됩니다 더미 진입. 나중에 두 번째 윈 토토를 정의 할 때 시스템은 추가로 더미 항목을 업데이트합니다 두 번째 정의의 정보. 당신이 사용하려고한다면 더미 운영자가 채워지기 전에 더미 운영자 오류 메시지를 받으십시오. (참고 :이 절차는 그렇지 않았습니다 안정적으로Postgres6.5 이전 버전 이제 일을하는 것이 권장되는 방법입니다.)
부정 조항은 제공되는 경우 윈 토토의 이름을 지정합니다. 윈 토토의 부정자가 정의됩니다. 우리는 그렇게 말합니다 윈 토토 a는 모두 반환하는 경우 윈 토토 B의 부정 자입니다. 부울 결과 및 (x a y)는 모두 (x b y)와 같습니다. 가능한 입력 x, y. B는 또한 A의 부정 자입니다. 예를 들어, '<'및 ' ='는 대부분의 부정기 쌍입니다. 데이터 유형. 운영자는 결코 자신의 것이 될 수 없습니다 부정관.
정류자와 달리 한 쌍의 단독 윈 토토가 유효하게 할 수 있습니다 서로의 부정 자로 표시됩니다. 그것은 (a x)를 의미합니다 모든 X의 경우 (B X)가 아니거나 Right-Unary와 동일합니다. 윈 토토.
운영자의 부정자는 동일한 왼쪽 및/또는 오른쪽을 가져야합니다. 인수는 윈 토토 자체로 유형을 유형합니다. 정류자, 윈 토토 이름 만 부정 조항.
부정기 제공은 쿼리 최적화에 매우 도움이됩니다 (x = y)와 같은 표현이 단순화 될 수 있으므로 x < y로. 이것은 당신보다 더 자주 나타납니다 다른 사람의 결과로 삽입 할 수 없기 때문에 생각하십시오. 재 배열.
동일하게 사용하여 정의 할 수 있습니다. 정류자 쌍에 대해 위에서 설명한 방법.
제한 조항은 제공된 경우 제한을 지명합니다 윈 토토의 선택성 추정 기능 (참고 이것은 윈 토토 이름이 아닌 함수 이름입니다). 얽매다 조항은 반환되는 이진 윈 토토에게만 적합합니다 부울. 제한 선택성 추정기의 아이디어 테이블의 행의 일부가 만족할 것인지 추측하는 것입니다. 양식의 사고 조건
Field Op Constant현재 윈 토토 및 특정 상수 값의 경우. 이것은 얼마나 많은 행에 대한 아이디어를 제공함으로써 Optimizer를 지원합니다. 이 형식을 가진 조항에 의해 제거 될 것입니다. (무엇 상수가 왼쪽에 있으면 궁금할까요? 잘, 그것은 통근자가위한 것들 중 하나입니다 ...)
새로운 제한 선택성 추정 기능 쓰기 이 장의 범위를 훨씬 능가하지만 다행히도 당신은 일반적으로 시스템의 표준 추정기 중 하나를 사용할 수 있습니다. 많은 자신의 운영자에게. 이것들은 표준입니다 제한 추정기 :
eqsel for = neqsel for < <또는 <=에 대한 scalarltsel 또는 =에 대한 scalargtsel이것이 범주라는 것이 조금 이상하게 보이지만 당신이 그것에 대해 생각한다면 그들은 의미가 있습니다. '='는 일반적으로 수락합니다 테이블에서 줄의 작은 부분 만; '<'윌 일반적으로 작은 분수 만 거부합니다. '<'는 a를 받아 들일 것입니다 주어진 상수가 어디에 떨어지는 지에 따라 해당 테이블 열의 값 범위 (그렇습니다. 진공 분석에 의해 수집되고 이용할 수있는 정보입니다. 선택성 추정기). '<='는 약간 더 큰 것을 받아들입니다 동일한 비교 상수에 대해 '<'보다 분수이지만 특히 우리가 어쨌든 거친 추측보다 낫지 않을 것입니다. 비슷한 발언 ''및 ' ='에 적용하십시오.
eqsel 또는 매우 높거나 매우 낮은 운영자를위한 neqsel 실제로 평등이 아니더라도 선택성 불평등. 예를 들어, 대략적인 기하학적 기하학적 운영자는 일반적으로 할 것이라고 가정 할 때 EQSEL을 사용합니다 테이블의 항목의 작은 부분 만 일치합니다.
비교를 위해 Scalarltsel과 Scalargtsel을 사용할 수 있습니다 현명한 변환 수단이있는 데이터 유형 범위 비교를위한 숫자 스칼라로. 가능하면 추가하십시오 일상에 의해 이해되는 데이터 타입 src/backend/utils/adt/selfuncs.c의 convert_to_scalar (). (결국,이 루틴은 다타 타입별로 대체되어야합니다 pg_type 테이블의 열을 통해 식별 된 함수; 하지만 아직 일어나지 않았습니다.)이 작업을 수행하지 않으면 상황이 여전히 작동하지만 Optimizer의 추정치는 그들이 할 수있는대로 좋습니다.
추가 선택성 함수가 설계되었습니다 SRC/백엔드/utils/adt/geo_selfuncs.c의 기하학적 윈 토토 Areael, Positionsel 및 Contsel. 이 글에서 이것들입니다 그냥 스터브, 그러나 당신은 그것들을 사용하고 싶을 수도 있습니다 (또는 더 나은 어쨌든 개선.
JOIN 절은 제공된 경우 JOIN SELECTIVE의 이름을 지정합니다 윈 토토의 추정 기능 (이것은 기능 이름, 윈 토토 이름이 아닙니다). 조항에 가입 한 것만 제작하십시오 부울을 반환하는 이진 윈 토토에게 감각. 아이디어 결합 선택성 추정기 뒤에는 어떤 분수가 있는지 추측하는 것입니다. 한 쌍의 테이블에있는 행의 줄은 어디에서 클라스를 만족시킬 것입니다 양식의 상태
table1.field1 op table2.field2현재 윈 토토의 경우. 제한 조항과 마찬가지로,이 최적화를 알아 낼 수 있도록 도와줍니다. 가능한 몇 가지 조인 시퀀스 중 어느 것이 최소한 일.
이전과 같이,이 장은 설명을 시도하지 않을 것입니다. 결합 선택성 추정기 기능을 작성하는 방법이지만 표준 추정기 중 하나를 사용하도록 제안하십시오. 하나는 적용 가능합니다 :
eqjoinsel for = <에 대한 Neqjoinsel <또는 <=에 대한 scalarltjoinsel 또는 =에 대한 scalargtjoinsel 2D 영역 기반 비교를위한 지역 조인셀 2D 위치 기반 비교를위한 위치 조인셀 2D 격리 기반 비교를위한 Contjoinsel
해시 조항은 시스템에 시스템에 그것이 OK이를 기준으로 해시 조인 메소드를 사용해보십시오. 윈 토토. 해시는 이진 윈 토토에게만 적합합니다 반환 부울, 실제로 운영자는 더 나은 일부 데이터 유형의 평등.
해시 조인의 기본 가정은 조인입니다 운영자는 왼쪽과 오른쪽 쌍에 대해서만 진실을 반환 할 수 있습니다. 동일한 해시 코드에 해시 값. 두 값을 넣으면 다른 해시 버킷에서 조인은 절대 비교하지 않습니다. 결합의 결과가 암시 적으로 윈 토토는 거짓이어야합니다. 따라서 지정하는 것은 결코 의미가 없습니다 평등을 나타내지 않는 운영자의 해시.
실제로 논리적 평등도 충분하지 않습니다. 그만큼 운영자는 순수한 비트 동등성을 더 잘 표현했습니다 해시 함수는 메모리에서 계산됩니다 비트에 관계없이 값의 표현 평균. 예를 들어, 시간 간격의 동등성은 약간 아닙니다 평등; 간격 평등 연산자는 두 번 간주합니다 동일한 기간이있는 경우 간격이 동일합니다. 그들의 엔드 포인트는 동일하지 않습니다. 이것이 의미하는 바는 a입니다 간격 필드간에 "="를 사용하여 가입하면 다릅니다 구현 된 경우보다 해시 조인으로 구현 된 경우 결과 또 다른 방법으로, 쌍의 많은 부분이 해시가 다른 값과 일치해야하며 결코 해시 조인에 비해. 그러나 최적화기가 사용하기로 결정한 경우 다른 종류의 결합, 평등의 모든 쌍 운영자는 동일하다고 말합니다. 우리는 그것을 원하지 않습니다 불일치의 종류이므로 우리는 간격 평등을 다음과 같이 표시하지 않습니다. 해시 가능.
해시가 결합하는 기계 의존적 방법도 있습니다. 옳은 일을하지 못할 수도 있습니다. 예를 들어, 당신의 경우 데이터 유형은 흥미롭지 않은 구조입니다. 패드 비트, 평등 윈 토토 해시를 표시하는 것은 안전하지 않습니다. (아마도 다른 운영자를 작성하여 보장하지 않는 한 사용하지 않은 비트는 항상 0입니다.) 또 다른 예는 플로트 데이터 유형이 해시 조인에 대해 안전하지 않다는 것입니다. ~에 IEEE 플로팅 포인트 표준을 충족하는 기계, 마이너스 0과 플러스 0은 다른 값입니다 (비트가 다릅니다 패턴) 그러나 동일하게 비교하도록 정의됩니다. 그래서, 플로트 평등은 해시, 마이너스 0 및 플러스 0으로 표시되었습니다. 해시 조인과 일치하지 않을 것이지만 그들은 다른 조인 프로세스와 일치합니다.
결론은 아마도 사용해야한다는 것입니다. 평등 운영자를위한 해시 (또는) memcmp ().에 의해 구현
정렬 조항은 시스템에 시스템에 그것이 합병 결합 메소드를 사용하는 것이 허용됩니다. 현재 운영자. 두 사람이라면 둘 다 지정해야합니다. 현재 운영자는 일부 데이터 쌍의 평등이어야합니다. Type, The Sort1 및 Sort2 Clauses는 순서 이름을 지정합니다. 왼쪽 및 오른쪽 데이터의 윈 토토 ( '<'윈 토토) 각각 유형.
병합 조인 오른쪽 테이블을 순서대로 스캔합니다 평행한. 따라서 두 데이터 유형 모두 완전 할 수 있어야합니다. 순서, 조인 연산자는 "동일한 장소"에 떨어지는 값 쌍에 대해 성공하십시오. 정렬 순서. 실제로 이것은 조인 연산자를 의미합니다 평등처럼 행동해야합니다. 그러나 Hashjoin과는 달리 왼쪽 및 오른쪽 데이터 유형은 동일합니다 (또는 적어도 Bitwise Equivalent), 두 가지 별개의 병합이 가능합니다 데이터가 논리적으로 호환되는 한 데이터 유형. 을 위한 예를 들어, int2-versus-int4 평등 연산자는 다음과 같습니다 합병 가능. 우리는 가져올 운영자 만 있으면됩니다 두 데이터 타입 모두 논리적으로 호환 가능한 순서로.
병합 정렬 연산자, 현재 연산자를 지정할 때 그리고 두 참조 작업자는 부울을 반환해야합니다. 정렬 1 운영자는 현재와 동일한 입력 데이터 유형이 있어야합니다. 연산자의 왼쪽 인수 유형 및 Sort2 연산자가 있어야합니다 두 입력 데이터 유형이 현재 연산자와 동일한 것입니다 올바른 인수 유형. (정류자 및 부정관과 마찬가지로, 이것은 이것입니다 연산자 이름이 지정하기에 충분하다는 것을 의미합니다. 운영자 및 시스템은 더미 운영자를 만들 수 있습니다. 이전에 평등 연산자를 정의하는 경우 항목 다른 것들.)
실제로 '='에 대한 정렬 조항 만 작성해야합니다. 윈 토토와 두 참조 작업자는 항상 있어야합니다 '<'. Merge Join을 사용하려고 시도합니다 다른 모든 것은 이유 때문에 희망없는 혼란을 초래할 것입니다 우리는 잠시 후에 볼 것입니다.
운영자에 대한 추가 제한이 있습니다 Mark Mergejoinable. 이러한 제한은 현재 없습니다 작업자가 확인했지만 병합 조인이 실패 할 수 있습니다. 진실이 아닌 경우 런타임 :
병합 합류 가능한 평등 윈 토토에게는 a가 있어야합니다 정류자 (두 개의 데이터 유형이 동일하거나 관련 평등 윈 토토가 다르면).
'<'및 ''주문 윈 토토가 있어야합니다 왼쪽 및 오른쪽 입력 데이터 유형을 합병 가능한 윈 토토 자체. 이 윈 토토필수'<'and ''라는 이름을 지정해야합니다. 당신은합니다 문제에 대한 선택이 없습니다. 명시 적으로 지정하기위한 조항. IF에 유의하십시오 왼쪽 및 오른쪽 데이터 유형은 다르며 이 윈 토토는 정렬 윈 토토와 동일합니다. 하지만 그들은 데이터 값을 정렬 윈 토토 또는 병합 조인이 작동하지 않습니다.