저자 :Tom Lane에 의해 작성되었습니다.
aPostgreSQL연산자 정의에는 몇 가지 선택적인 조항이 포함될 수 있습니다 시스템은 스포츠 토토 사이트의 행동 방식에 대한 유용한 것들. 이것들 조항은 가능할 때마다 제공되어야합니다 사용하는 쿼리 실행에 상당한 속도를 높이십시오. 연산자. 그러나 당신이 그들에게 제공한다면, 당신은 옳다! 최적화 조항을 잘못 사용하면 발생할 수 있습니다 백엔드 충돌, 미묘하게 잘못된 출력 또는 기타 나쁜 것들. 너 확실하지 않은 경우 항상 최적화 조항을 남길 수 있습니다. 그것에 대해; 유일한 결과는 쿼리가 느리게 실행될 수 있다는 것입니다 필요한 것보다.
추가 최적화 조항이 향후 추가 될 수 있습니다 버전PostgreSQL. 그들 여기에 설명 된 모든 것이 릴리스 7.3.21입니다 이해합니다.
theCommutator조항, 제공되는 경우, 스포츠 토토 사이트의 통근자 인 스포츠 토토 사이트의 이름 한정된. 우리는 스포츠 토토 사이트 A가 스포츠 토토 사이트 B의 통근자라고 말합니다. 경우 (x a y)가 가능한 모든 입력 값 x, y에 대해 (y b x)와 동일합니다. B는 또한 A의 정류자입니다. 예를 들어, 연산자<and특정 데이터 유형의 경우 일반적으로 각각입니다 기타의 정류자 및 스포츠 토토 사이트+is 일반적으로 그 자체로 정류. 그러나 스포츠 토토 사이트-보통 아무것도 통근하지 않습니다.
통근 연산자의 왼쪽 피연산자 유형은 다음과 같습니다. 정류자의 올바른 피연산자 유형 및 그 반대도 마찬가지입니다. 그래서 통근자 운영자의 이름이 그 모든 것입니다PostgreSQL조회하려면 주어야합니다 정류자, 그리고 그게 전부입니다.Commutator조항
자체 관리 연산자를 정의 할 때, 당신은 그냥 그것을하십시오. 한 쌍의 정류 연산자를 정의 할 때 상황은 조금 까다 롭습니다. 첫 번째는 어떻게 될 수 있습니까? 정의 된 다른 것을 참조하십시오. 아직 정의하지 않은 다른 것을 참조하십시오. 이 문제에 대한 두 가지 해결책이 있습니다.
한 가지 방법은를 생략하는 것입니다.Commutator첫 번째 연산자의 조항 정의 한 다음 두 번째 운영자의 하나를 제공합니다. 정의. 부터PostgreSQL두 번째 정의를 볼 때 연산자가 쌍으로옵니다. 자동으로 돌아가서 누락 된 것을 채 웁니다Commutator첫 번째 조항 정의.
더 간단한 방법은 단지 포함하는 것입니다Commutator두 조항 정의. 언제PostgreSQL첫 번째를 처리합니다 정의하고 그것을 깨닫고Commutator존재하지 않는 것을 말합니다 연산자, 시스템은 더미에 더 많은 항목을 만들 것입니다. 시스템 카탈로그의 연산자. 이 더미 출품작은 가질 것입니다 스포츠 토토 사이트 이름, 왼쪽 및 오른쪽에 대해서만 유효한 데이터 피연산자 유형 및 결과 유형은 전부이기 때문에PostgreSQL추론 할 수 있습니다 이 점. 첫 번째 스포츠 토토 사이트의 카탈로그 항목이 링크됩니다 이 더미 항목. 나중에 두 번째를 정의 할 때 연산자, 시스템은 더미 항목을 업데이트합니다 두 번째 정의의 추가 정보. 당신이 더미 연산자가 채워지기 전에 사용하십시오. 오류 메시지가 표시됩니다. (참고 :이 절차는 그랬습니다 안정적으로 작동하지 않음PostgreSQL6.5 이전 버전 이제 일을하는 것이 권장되는 방법입니다.)
the부정관조항, 제공되는 경우, 운영자의 부정인 인 연산자의 이름 한정된. 우리는 운영자 A가 연산자 B의 부정 자라고 말합니다. 둘 다 부울 결과를 반환하고 (x a y)는 (x b y)와 동일합니다. 가능한 모든 입력 x, y. B는 또한 부정 자입니다 A. 예를 들어<and =대부분의 데이터 유형에 대한 부정 쌍입니다. an 스포츠 토토 사이트는 결코 자신의 부정자가 될 수 없습니다.
정류자와 달리 한 쌍의 단독 스포츠 토토 사이트가 유효하게 할 수 있습니다 서로의 부정 자로 표시됩니다. 그것은 (a x)를 의미합니다 모든 X의 경우 (B X)가 아니거나 오른쪽 단지에 해당합니다. 연산자.
스포츠 토토 사이트의 부정자는 동일한 왼쪽 및/또는 오른쪽을 가져야합니다. 오페라는 스포츠 토토 사이트 자체로 유형이므로와 마찬가지로Commutator, 연산자 이름 만 에 필요합니다부정관조항
부정기 제공은 쿼리 최적화에 매우 도움이됩니다. 와 같은 표현을 허용하기 때문에NOT (x = 와이)x < y로 단순화됩니다. 이것은 더 나옵니다 당신이 생각하는 것보다 종종not결과적으로 작업을 삽입 할 수 있습니다 다른 재 배열의.
동일하게 사용하여 정의 할 수 있습니다. 정류자 쌍에 대해 위에서 설명한 방법.
the제한조항, 제공되는 경우, 제한 선택성 추정 함수의 이름을 지정합니다 연산자 (이것은 연산자가 아닌 함수 이름입니다. 이름).제한조항 만 만들어집니다 반환되는 이진 연산자에 대한 감각부울. 제한 선택성의 아이디어 추정기는 테이블의 행의 일부가 만족여기서-Clase 조건 양식
열 상수
현재 연산자 및 특정 상수 값의 경우. 이것은 얼마나 많은지에 대한 아이디어를 제공함으로써 Optimizer를 지원합니다. 행은에 의해 제거됩니다.여기서이 양식을 가진 조항. (상수가 발생하면 어떻게됩니까? 왼쪽에 궁금할까요? 글쎄, 그것은 하나입니다 그 것들Commutator
새로운 제한 선택성 추정 기능 쓰기는 다음과 같습니다 이 장의 범위를 훨씬 뛰어 넘지 만 다행히도 일반적으로 시스템의 표준 추정기 중 하나를 사용하십시오. 많은 자신의 운영자. 이것들은 표준 제한입니다 추정기 :
eqsel for= |
neqsel for< |
Scalarltsel for<또는<= |
Scalargtsel for또는 = |
당신은 자주 사용하여 자주 도망 갈 수 있습니다eqsel
또는neqsel
선택성이 매우 높거나 매우 낮은 연산자, 심지어
그들이 실제로 평등이나 불평등이 아니라면. 예를 들어,
대략 평등 기하학적 스포츠 토토 사이트 사용eqsel
일반적으로 그들이 보일 것이라고 가정합니다
테이블의 항목의 작은 부분 만 일치합니다.
사용할 수 있습니다Scalarltsel
andScalargtsel
비교
현명한 변환 수단이있는 데이터 유형
범위 비교를위한 숫자 스칼라로. 가능하면 추가하십시오
일상에 의해 이해되는 데이터 유형convert_to_scalar ()
insrc/backend/utils/adt/selfuncs.c. (결국,
이 루틴은 데이터 당 유형 기능으로 대체되어야합니다
열을 통해 식별pg_type
시스템 카탈로그; 그러나 그것은 그렇지 않았습니다
아직 일어났다.)이 작업을 수행하지 않으면 여전히 일이 작동합니다.
그러나 Optimizer의 추정치는 가능한 한 좋지 않을 것입니다.
BE.
추가 선택성 함수가 설계되었습니다
기하학적 연산자src/backend/utils/adt/geo_selfuncs.c:
Areael
, Positiessel
및Contsel
. 이 글에서 이것은 단지입니다
스터브, 그러나 당신은 그것들을 사용하고 싶을 수도 있습니다 (또는 더 나은 개선
그들) 어쨌든.
theJoin조항, 제공된 경우 이름 연산자의 조인 선택성 추정 함수 (참고 이것은 연산자 이름이 아닌 함수 이름이라는 것입니다).Join절은 이진에 대해서만 적합합니다 반환하는 스포츠 토토 사이트부울. 아이디어 결합 선택성 추정기 뒤에는 어떤 분수가 있는지 추측하는 것입니다. 한 쌍의 테이블에있는 행의 줄은 A를 만족시킬 것입니다여기서-양식의 클래스 조건
표 1.column1 op table2.column2
현재 연산자의 경우. 와 마찬가지로제한절, 이것은 최적화에 도움이됩니다 실질적으로 몇 가지 중 어느 것을 알아 낼 수있게함으로써 가능한 조인 시퀀스는 최소한의 작업을 수행 할 가능성이 높습니다.
이전과 같이,이 장은 방법을 설명하려고 시도하지 않을 것입니다. 결합 선택성 추정기 기능을 작성하려면 표준 추정기 중 하나를 사용하는 경우 해당되는:
eqjoinsel for= |
Neqjoinsel for< |
scalarltjoinsel for<또는<= |
Scalargtjoinsel for또는 = |
AreaJoinsel 2d
지역 기반 비교 |
PositionJoinsel 2d
위치 기반 비교 |
contjoinsel 2d
격리 기반 비교 |
the해시현재의 경우 절, 해시 조인을 사용하는 것이 허용되는 시스템에 시스템에 알려줍니다. 이 연산자를 기반으로 결합 방법.해시이진 연산자에게만 적합합니다 그 반환부울및 실제로 스포츠 토토 사이트는 일부 데이터 유형에 대해 평등이 더 좋았습니다.
해시 조인의 기본 가정은 조인입니다 운영자는 왼쪽과 오른쪽 쌍에 대해서만 진실을 반환 할 수 있습니다. 동일한 해시 코드에 해시 값. 두 값을 넣으면 다른 해시 버킷에서 조인은 절대 비교하지 않습니다. 모두가 조인 연산자의 결과가 암시 적으로 거짓이어야합니다. 따라서 지정하는 것은 의미가 없습니다해시대표하지 않는 연산자의 경우 평등.
실제로 논리적 평등도 충분하지 않습니다. 그만큼 운영자는 순수한 비트 동등성을 더 잘 표현했습니다 해시 함수는 메모리 표현에서 계산됩니다. 비트의 의미에 관계없이 값의. 예를 들어, 시간 간격의 평등은 비교적 평등이 아닙니다. 그만큼 간격 평등 연산자는 두 시간 간격을 동일하게 간주합니다 동일한 기간이있는 경우 엔드 포인트 여부에 관계없이 동일합니다. 이것이 의미하는 바는 사용에 가입하는 것입니다.=간격 필드 사이의 결과는 다릅니다 구현 된 경우보다 해시 조인으로 구현 된 경우 결과 다른 방법으로, 쌍의 큰 부분이 일치하는 것은 다른 값으로 해시되며 결코 비교되지 않습니다. 해시 조인에 의해. 그러나 최적화가 다른 것을 사용하기로 선택한 경우 평등 연산자가 말하는 모든 쌍은 동일하게 찾을 수 있습니다. 우리는 그런 종류의 불일치를 원하지 않습니다. 그래서 우리는 간격 평등을 해시 가능으로 표시하지 않습니다.
해시가 결합하는 기계 의존적 방법도 있습니다. 옳은 일을하지 못할 수도 있습니다. 예를 들어, 데이터 인 경우 유형은 무관심 패드가있을 수있는 구조입니다. 비트, 평등 연산자를 표시하는 것은 안전하지 않습니다해시. (아마도 당신은 다른 사람을 쓰지 않는 한 사용하지 않은 비트가 항상 0임을 보장하는 연산자.) 또 다른 예는 부동 소수점 데이터 유형이라는 것입니다 해시 조인에 대한 안전하지 않습니다. 를 충족하는 기계에서IEEE플로팅 포인트 표준, 마이너스 0 및 + 0은 다른 값입니다 (다른 비트 패턴) 그러나 동일하게 비교하도록 정의됩니다. 따라서 부동 소수점 데이터 유형의 평등 연산자가 두드러진해시, 마이너스 0 및 플러스 0은 아마도 해시 조인에 의해 일치하지 않을 것이지만 다른 조인 프로세스와 일치합니다.
결론은 아마만 사용해야한다는 것입니다해시평등 연산자의 경우
(또는 가능) 구현memcmp ()
.
the병합clause, 현재의 경우, 시스템에 병합 조인을 사용하는 것이 허용되는 것을 알려줍니다. 이 연산자를 기반으로 결합 방법.병합이진 연산자에게만 적합합니다 그 반환부울및 실제로 운영자는 일부 데이터 유형 또는 쌍의 평등을 나타내야합니다. 데이터 유형의.
병합 조인 오른쪽 테이블을 순서대로 정리 한 다음 스캔합니다 평행한. 따라서 두 데이터 유형 모두 완전 할 수 있어야합니다. 순서, 조인 연산자는 에 떨어지는 값 쌍에 대해 성공하십시오."같은 장소"정렬 순서로. 실제로 이것 가입 연산자가 평등처럼 행동해야 함을 의미합니다. 하지만 왼쪽 및 오른쪽 데이터 유형이 가진 해시 조인과 달리 더 낫습니다 (또는 적어도 비트 동등한) 두 가지 별개의 데이터 유형을 병합 할 수 있습니다. 논리적으로 호환됩니다. 예를 들어,int2-ersus-int4평등 연산자는 합병 가능합니다. 우리는 정렬 연산자 만 있으면됩니다 두 데이터 유형 모두 논리적으로 호환됩니다 순서.
병합 조인의 실행은 시스템을 사용할 수 있어야합니다. 병합 결합 평등과 관련된 4 개의 연산자를 식별합니다 연산자 : 왼쪽 입력 데이터 유형에 대한 비교 이상의 비교 올바른 입력 데이터 유형에 대한 비교보다 덜 비교 두 데이터 유형과보다 큰 비교 두 데이터 유형의 비교. (이것은 실제로 4입니다 고유 한 연산자 병합 합류 가능한 연산자에게 2가있는 경우 다른 입력 데이터 유형; 그러나 입력 유형이 동일한 세 명의 운영자가 모두 동일한 연산자입니다.) 이름으로 이러한 연산자를 개별적으로 지정할 수 있습니다. 로Sort1, Sort2, LTCMP및gtcmp각각 옵션. 시스템 기본 이름을 작성합니다<, <, <, 이들 중 하나라도 각각 생략병합지정되어 있습니다. 또한,병합이 네 가지 연산자 옵션 중 하나가 나타나면 그들 중 일부를 지정하고 시스템을 채울 수 있습니다. 나머지에서.
4 개의 비교 연산자의 입력 데이터 유형은 합병 가능한 연산자의 입력 유형에서 추론 똑같이Commutator만 이 조항에는 운영자 이름이 필요합니다. 당신이 아니라면 독특한 연산자 이름을 사용하면 충분합니다 쓰다병합시스템을 채우십시오 세부 사항에서. (Commutatorand부정관, 시스템이 가능합니다 정의 할 경우 더미 스포츠 토토 사이트 항목을 만듭니다. 다른 사람 앞의 평등 스포츠 토토 사이트.)
표시하는 연산자에 대한 추가 제한이 있습니다 합병 가능한. 이러한 제한은 현재 확인되지 않습니다스포츠 토토 사이트 만들기이지만 오류가 발생할 수 있습니다 사실이 아닌 경우 연산자가 사용되는 경우 :
병합 접합 가능한 평등 연산자는 a가 있어야합니다 합병 가능한 정류자 (두 개의 데이터 유형이있는 경우 자체 동일하거나 관련 평등 연산자가 다른).
2와 관련된 합병 가능한 연산자가있는 경우 데이터 유형 A 및 B 및 다른 병합 가능한 연산자 B를 세 번째 데이터 유형 C와 관련 시키면 A와 C도 병합 가능한 연산자가 있습니다. 다시 말해, a 합병 가능한 운영자는 전이적이어야합니다.
기괴한 결과는 런타임에 4 명 이어집니다 비교 연산자 이름 이름은 데이터 값을 정렬하지 않습니다. 호환.
참고 :inPostgreSQL7.3 이전 버전,병합속기는 아니었다 사용 가능 : 합병 가능한 스포츠 토토 사이트를 만들기 위해 둘 다 쓰기Sort1andSort2명시 적으로. 또한,LTCMPandgtcmp옵션이 존재하지 않았습니다. 그 스포츠 토토 사이트의 이름은였습니다 hardwired as<and각각.