apostgresql범퍼카 토토 정의에는 몇 가지 선택적인 조항이 포함될 수 있습니다 시스템은 범퍼카 토토의 행동 방식에 대한 유용한 것들. 이것들 조항은 가능할 때마다 제공되어야합니다 사용하는 쿼리 실행에 상당한 속도를 높이십시오. 연산자. 그러나 당신이 그들에게 제공한다면, 당신은 옳다! 최적화 조항을 잘못 사용하면 발생할 수 있습니다 서버 프로세스 충돌, 미묘하게 잘못된 출력 또는 기타 나쁜 것들. 그렇지 않은 경우 항상 최적화 조항을 남길 수 있습니다. 그것에 대해 확실히; 유일한 결과는 쿼리가 실행될 수 있다는 것입니다 필요한 것보다 느립니다.
추가 최적화 조항이 향후 추가 될 수 있습니다 버전PostgreSQL. 그들 여기에 설명 된 모든 것이 8.0.26을 릴리스합니다 이해합니다.
theCommutator조항, 제공되는 경우, 범퍼카 토토의 통근자 인 범퍼카 토토의 이름 한정된. 우리는 범퍼카 토토 A가 범퍼카 토토 B의 통근자라고 말합니다. 경우 (x a y)가 가능한 모든 입력 값 x, y에 대해 (y b x)와 동일합니다. B는 또한 A의 정류자입니다. 예를 들어, 연산자<및특정 데이터 유형의 경우 일반적으로 각각입니다 기타의 정류자 및 범퍼카 토토+IS 일반적으로 그 자체로 정류. 그러나 범퍼카 토토-보통 아무것도 통근하지 않습니다.
통근 가능한 연산자의 왼쪽 피연산자 유형은 동일합니다. 정류자의 올바른 피연산자 유형으로, 그 반대도 마찬가지입니다. 그래서 통근자 범퍼카 토토의 이름이 그 모든 것입니다PostgreSQL조회하려면 주어야합니다 정류자, 그리고 그게 전부입니다.Commutator절.
통근자 정보를 제공하는 것이 중요합니다 인덱스에 사용되고 조항에 가입하는 연산자, 이것은 쿼리 옵티마이저를 허용하기 때문에"Flip Around"필요한 양식에 대한 그러한 조항 다른 계획 유형의 경우. 예를 들어, a가있는 쿼리를 고려하십시오 어디서 절tab1.x = tab2.y, 어디tab1.xandtab2.y는 사용자 정의 유형이며 가정합니다 저것tab2.y색인이 표시됩니다. 최적화기 방법을 결정할 수 없으면 인덱스 스캔을 생성 할 수 없습니다. 조항을 뒤집어tab2.y = tab1.x, 인덱스 스캔 기계가 볼 것으로 예상되기 때문입니다 연산자의 왼쪽에있는 인덱스 열에 제공됩니다.PostgreSQLWillnot이것은 단순히 이것이 a라고 가정합니다 유효한 변환 -의 제작자=범퍼카 토토가 유효하다고 지정해야합니다 정류자 정보로 범퍼카 토토를 표시합니다.
자체 관리 연산자를 정의 할 때, 당신은 그냥 그것을하십시오. 한 쌍의 정류 연산자를 정의 할 때 상황은 조금 까다 롭습니다. 첫 번째는 어떻게 될 수 있습니까? 정의 된 다른 것을 참조하십시오. 아직 정의하지 않은 다른 것을 참조하십시오. 이 문제에 대한 두 가지 해결책이 있습니다.
한 가지 방법은를 생략하는 것입니다.Commutator첫 번째 연산자의 조항 정의 한 다음 두 번째 운영자의 하나를 제공합니다. 정의. 부터PostgreSQL그 정류를 알고 있습니다 두 번째 정의를 볼 때 연산자가 쌍으로옵니다. 자동으로 돌아가서 누락 된 것을 채 웁니다Commutator첫 번째 조항 정의.
더 간단한 방법은 단지 포함하는 것입니다Commutator둘 다의 조항 정의. 언제PostgreSQL첫 번째를 처리합니다 정의하고 그것을 깨닫고Commutator존재하지 않는 연산자, 시스템은 시스템 카탈로그. 이 더미 항목에는 유효한 데이터 만 있습니다 범퍼카 토토 이름, 왼쪽 및 오른쪽 피연산자 유형 및 결과 유형, 그게 전부PostgreSQL이 시점에서 추론 할 수 있습니다. 첫 번째 범퍼카 토토의 카탈로그 항목은이 더미에 링크됩니다. 기입. 나중에 두 번째 연산자를 정의 할 때 시스템은 추가로 더미 항목을 업데이트합니다 두 번째 정의의 정보. 당신이 사용하려고한다면 더미 연산자가 채워지기 전에 오류 메시지 가져 오기.
the부정관조항, 제공되는 경우, 범퍼카 토토의 부정인 인 연산자의 이름 한정된. 우리는 범퍼카 토토 A가 연산자 B의 부정 자라고 말합니다. 둘 다 부울 결과를 반환하고 (x a y)는 (x b y)와 동일합니다. 가능한 모든 입력 x, y. B는 또한 부정 자입니다 A. 예를 들어<and =대부분의 데이터 유형에 대한 부정 쌍입니다. an 범퍼카 토토는 결코 자신의 부정자가 될 수 없습니다.
정류자와 달리 한 쌍의 단백조 연산자가 유효하게 할 수 있습니다 서로의 부정 자로 표시됩니다. 그것은 (a x)를 의미합니다 모든 X의 경우 (B X)가 아니거나 오른쪽 단지에 해당합니다. 연산자.
범퍼카 토토의 부정자는 동일한 왼쪽 및/또는 오른쪽을 가져야합니다. 오페라는 정의 할 연산자로서 유형이므로와 마찬가지로Commutator, 연산자 이름 만 에 필요합니다부정관절.
부정기 제공은 쿼리 최적화에 매우 도움이됩니다. 와 같은 표현을 허용하기 때문에NOT (x = 와이)단순화하려면x < 와이. 이것은 당신이 생각하는 것보다 더 자주 나타납니다.not운영을 a로 삽입 할 수 있습니다 다른 재 배열의 결과.
동일하게 사용하여 정의 할 수 있습니다. 정류자 쌍에 대해 위에서 설명한 방법.
the제한조항, 제공되는 경우, 제한 선택성 추정 함수의 이름을 지정합니다 연산자. (이것은 연산자가 아닌 함수 이름입니다. 이름.)제한조항은 만듭니다 반환되는 이진 연산자에 대한 감각부울. 제한 선택성의 아이디어 추정기는 테이블의 행의 일부가 만족여기서-Clase 조건 양식
컬럼 OP Constant
현재 연산자 및 특정 상수 값의 경우. 이것은 얼마나 많은지에 대한 아이디어를 제공함으로써 Optimizer를 지원합니다. 행은에 의해 제거됩니다.여기서이 양식을 가진 조항. (상수가 발생하면 어떻게됩니까? 왼쪽에 궁금할까요? 글쎄, 그것은 하나입니다 그 것들CommutatorIS for ...)
새로운 제한 선택성 추정 기능 쓰기는 다음과 같습니다 이 장의 범위를 훨씬 뛰어 넘지 만 다행히도 일반적으로 시스템의 표준 추정기 중 하나를 사용하십시오. 많은 자신의 운영자. 이것들은 표준 제한입니다 추정기 :
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:
Aredel
, Positionsel
및Contsel
. 이 글에서 이것은 단지입니다
스터브, 그러나 당신은 그것들을 사용하고 싶을 수도 있습니다 (또는 더 나은 개선
그들) 어쨌든.
theJoin조항, 제공된 경우 이름 연산자의 결합 선택성 추정 기능. (메모 이것은 연산자 이름이 아닌 함수 이름입니다.)Join조항은 이진에 대해서만 적합합니다 반환하는 범퍼카 토토부울. 아이디어 결합 선택성 추정기 뒤에는 어떤 분수가 있는지 추측하는 것입니다. 한 쌍의 테이블에있는 행의 줄은 A를 만족시킬 것입니다여기서-양식의 클래스 조건
표 1.column1 op table2.column2
현재 연산자의 경우. 와 마찬가지로제한절, 이것은 최적화에 도움이됩니다 실질적으로 몇 가지 중 어느 것을 알아 낼 수있게함으로써 가능한 조인 시퀀스는 최소한의 작업을 수행 할 가능성이 높습니다.
이전과 같이,이 장은 방법을 설명하려고 시도하지 않을 것입니다. 결합 선택성 추정기 기능을 작성하려면 표준 추정기 중 하나를 사용하는 경우 해당되는:
eqjoinsel for= |
Neqjoinsel for< |
scalarltjoinsel for<또는<= |
Scalargtjoinsel for또는 = |
AreaJoinsel 24442_24484 |
PositionJoinsel 2d
위치 기반 비교 |
contjoinsel 2d
격리 기반 비교 |
the해시참석하는 경우 조항, 해시 조인을 사용하는 것이 허용되는 시스템에 시스템에 알려줍니다. 이 연산자를 기반으로 결합 방법.해시이진 연산자에게만 적합합니다 반환부울및 실제로 범퍼카 토토는 일부 데이터 유형에 대해 평등이 더 좋았습니다.
해시 조인의 기본 가정은 조인입니다 운영자는 왼쪽과 오른쪽 쌍에 대해서만 진실을 반환 할 수 있습니다. 동일한 해시 코드에 해시 값. 두 값을 넣으면 다른 해시 버킷에서 조인은 절대 비교하지 않습니다. 모두가 조인 연산자의 결과가 암시 적으로 거짓이어야합니다. 따라서 지정하는 것은 의미가 없습니다해시대표하지 않는 연산자의 경우 평등.
표시 될해시, 가입 연산자는 해시 인덱스 연산자 클래스에 나타나야합니다. 이것은 물론 연산자를 만들 때 시행되지 않습니다. 참조 연산자 클래스는 아직 존재할 수 없었습니다. 그러나 시도합니다 해시 조인의 연산자를 사용하여 런타임에 실패합니다. 운영자 클래스가 존재합니다. 시스템은 운영자 클래스가 필요합니다 연산자의 데이터 유형 특이 적 해시 함수를 찾으십시오 입력 데이터 유형. 물론, 당신은 또한 적절한 것을 제공해야합니다 연산자 클래스를 생성하기 전에 해시 기능.
해시 기능을 준비 할 때주의를 기울여야합니다.
실패 할 수있는 기계에 따른 방법이 있기 때문에
옳은 일을하기 위해. 예를 들어, 데이터 유형이 a 인 경우
흥미롭지 않은 패드 비트가있을 수있는 구조, 당신
전체 구조를 단순히 전달할 수는 없습니다.hash_any
. (다른 사람을 쓰지 않는 한
사용하지 않은 비트가
항상 0, 권장 전략입니다.) 또 다른
예를 들어를 충족하는 기계에서IEEE플로팅 포인트 표준, 음수 0
그리고 긍정적 인 0은 다른 값 (다른 비트 패턴)입니다.
그러나 그들은 동등한 비교로 정의됩니다. 플로트 값이 가능하다면
음수 제로를 포함하면 추가 단계가 필요합니다.
동일한 해시 값을 Positive Zero와 생성합니다.
참고 :해시 접합 가능의 기본 기능 운영자는 불변하거나 안정적으로 표시되어야합니다. 그렇다면 휘발성, 시스템은 운영자를 사용하려고 시도하지 않습니다. 해시 가입.
참고 :해시에 접을 수있는 연산자가있는 경우 엄격하게 표시된 기본 함수, 기능 또한 완료해야합니다. 즉, 진실을 반환하거나 두 개의 비 unnull 입력에 대해 False, Necl, Null은 아닙니다. 이 규칙이라면 따르지 않음, 해시 최적화in운영은 잘못된 결과를 생성 할 수 있습니다. (구체적으로,in돌아올 수 있습니다 표준에 따른 정답 인 경우 거짓 무일하다; 또는이를 불평하는 오류가 발생할 수 있습니다 널 결과를 위해 준비되지 않았습니다.)
the병합현재의 경우 절, 시스템에 병합 결합을 사용하는 것이 허용되는 것을 알려줍니다. 이 연산자를 기반으로 결합 방법.병합이진 연산자에게만 적합합니다 반환부울및 실제로 운영자는 일부 데이터 유형 또는 쌍의 평등을 나타내야합니다. 데이터 유형의.
병합 조인 오른쪽 테이블을 순서대로 정리 한 다음 스캔합니다 평행한. 따라서 두 데이터 유형 모두 완전 할 수 있어야합니다. 순서, 조인 연산자는 에 떨어지는 값 쌍에 대해 성공하십시오."같은 장소"정렬 순서로. 실제로 이것 가입 연산자가 평등처럼 행동해야 함을 의미합니다. 하지만 왼쪽 및 오른쪽 데이터 유형이 가진 해시 조인과 달리 더 낫습니다 (또는 적어도 비트 동등한) 두 가지 별개의 데이터 유형을 병합 할 수 있습니다. 논리적으로 호환됩니다. 예를 들어,smallint-ersus-Integer평등 연산자는 합병 가능합니다. 정렬 만 있으면됩니다 두 데이터 유형을 모두 논리적으로 가져올 연산자 호환 시퀀스.
병합 조인의 실행은 시스템을 사용할 수 있어야합니다. 병합 결합 평등과 관련된 4 개의 연산자를 식별합니다 운영자 : 왼쪽 오페라 데이터 유형에 대한 비교가 적음, 올바른 피연산자 데이터 유형에 대한 비교보다 덜 비교 두 데이터 유형과보다 큰 비교 두 데이터 유형의 비교. (이것은 실제로 4입니다 고유 한 연산자 병합 합류 가능한 연산자에게 2가있는 경우 다른 피연산자 데이터 유형; 그러나 피연산자 유형이있을 때 동일한 세 명의 운영자가 모두 동일합니다. 연산자.)이 연산자를 지정할 수 있습니다 이름으로 개별적으로Sort1, Sort2, LTCMP, 그리고gtcmp각각 옵션. 그만큼 시스템이 기본 이름을 작성합니다<, <, <, 각각 이 중 하나가 생략 된 경우병합지정되어 있습니다. 또한,병합이 네 가지 범퍼카 토토 옵션이 나타나므로 가능합니다. 그들 중 일부를 지정하고 시스템이 나머지.
4 개의 비교 연산자의 피연산자 데이터 유형은 병합 합병 가능의 피연산자 유형에서 추론됩니다 운영자,Commutator, 이 조항에는 범퍼카 토토 이름 만 제공됩니다. 하지 않는 한 당신은 독특한 연산자 이름을 사용하고 있습니다 쓸 수있을만큼병합시스템은 세부 사항을 채 웁니다. (Commutator및부정관, 시스템이 발생하면 더미 범퍼카 토토 항목을 만들 수 있습니다. 평등 연산자를 다른 것보다 먼저 정의하려면.)
당신이 표시하는 연산자에 대한 추가 제한이 있습니다 합병 가능한. 이러한 제한은 현재 확인되지 않습니다범퍼카 토토 생성그러나 오류가 발생할 수 있습니다 사실이 아닌 경우 연산자가 사용되는 경우 :
병합 합의 가능한 평등 조작자는 a가 있어야합니다 합병 가능한 정류자 (두 개의 피연산자 데이터 인 경우 자체 유형은 동일하거나 관련 평등 연산자가 다릅니다).
2와 관련된 합병 가능한 연산자가있는 경우 데이터 유형 A 및 B 및 다른 병합 가능한 연산자 B를 세 번째 데이터 유형 C와 관련 시키면 A와 C도 병합 가능한 연산자가 있습니다. 다시 말해, a 합병 가능한 운영자는 전이적이어야합니다.
기괴한 결과는 런타임에 4가 발생합니다 비교 연산자 이름 이름은 데이터 값을 정렬하지 않습니다. 호환.
참고 :병합 합류 가능한 기능 운영자는 불변하거나 안정적으로 표시되어야합니다. 그렇다면 휘발성, 시스템은 운영자를 사용하려고 시도하지 않습니다. 합병 조인.
참고 :inPostgreSQL7.3 이전 버전,병합속기는 아니었다 사용 가능 : 합병 가능한 범퍼카 토토를 만들기 위해 둘 다 쓰기Sort1및Sort2명시 적으로. 또한,LTCMP및gtcmp옵션이 존재하지 않았습니다. 그 범퍼카 토토의 이름은였습니다 hardwired as<and각각.