이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 36.15. 토토 꽁 머니 최적화 정보버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

35.13. 토토 베이 최적화 정보

aPostgreSQL연산자 정의에는 몇 가지 선택적인 조항이 포함될 수 있습니다 시스템은 토토 베이의 행동 방식에 대한 유용한 것들. 이 조항 그들이 만들 수 있기 때문에 적절할 때마다 제공되어야합니다. 사용하는 쿼리 실행에있어 상당한 속도 연산자. 그러나 당신이 그들에게 제공한다면, 당신은 그들이 오른쪽! 최적화 조항을 잘못 사용하면 느리게 발생할 수 있습니다. 쿼리, 미묘하게 잘못된 출력 또는 기타 나쁜 것들. 당신은 항상 할 수 있습니다 확실하지 않은 경우 최적화 조항을 제외하십시오. 그만큼 결과는 쿼리가 필요한 것보다 느리게 실행될 수 있다는 것입니다. 에게.

추가 최적화 조항이 향후 추가 될 수 있습니다 버전PostgreSQL. 그들 여기에 설명 된 모든 것이 릴리스 9.3.25입니다 이해합니다.

35.13.1. Commutator

theCommutator조항, 제공되는 경우, 토토 베이의 통근자 인 토토 베이의 이름 한정된. 우리는 토토 베이 A가 토토 베이 B의 정류자라고 말합니다. (x a y) 가능한 모든 입력 값 x, y에 대해 (y b x)와 같습니다. 알아채다 그 b는 또한 A의 정류자이기도합니다. 예를 들어, 연산자<and특정 데이터 유형은 일반적으로 서로의 통근자이며 연산자+는 일반적으로 통근 적입니다 그 자체. 그러나 토토 베이-일반적으로 그렇지 않습니다 무엇이든 통근 적.

통근 가능한 연산자의 왼쪽 피연산자 유형은 다음과 같습니다. 정류자의 올바른 피연산자 유형 및 그 반대도 마찬가지입니다. 그래서 정류자 운영자의 이름이 그 모든 것입니다PostgreSQL정류자, 그리고 그게 전부입니다.Commutator조항

운영자에게 통근자 정보를 제공하는 것이 중요합니다 이는 인덱스에 사용되며 조항에 가입합니다. 쿼리 최적화"Flip Around"다른 계획 유형에 필요한 양식에 대한 그러한 조항. 을 위한 예를 들어, where 절이있는 쿼리를 고려하십시오.tab1.x = tab2.y, 여기서tab1.xandtab2.ya 사용자 정의 유형,tab2.y색인이 표시됩니다. Optimizer는 인덱스 스캔을 생성 할 수 없습니다 조항을 뒤집는 방법을 결정할 수 있습니다tab2.y = tab1.x, 인덱스 스캔 기계이기 때문에 연산자의 왼쪽에 인덱스 된 열을 볼 것으로 예상됩니다. 주어진.PostgreSQLWillnot단순히 그것을 가정합니다 이것은 유효한 변형입니다 -의 제작자=토토 베이는 마킹을 통해 유효하다는 것을 지정해야합니다 정류자 정보가있는 연산자.

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

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

  • 더 간단한 방법은 단지 포함하는 것입니다Commutator두 정의의 조항. 언제PostgreSQL첫 번째 정의와 그것을 알고Commutator존재하지 않는 연산자 인 The 시스템은 시스템에서 해당 연산자를 위해 더미에 들어갑니다. 목록. 이 더미 항목은 토토 베이 이름, 왼쪽 및 오른쪽 피연산자 유형 및 결과 유형 이후 그게 다야postgresqlcan 이 시점에서 추론하십시오. 첫 번째 토토 베이의 카탈로그 항목이 링크됩니다 이 더미 항목에. 나중에 두 번째 연산자를 정의 할 때 시스템은 추가 정보로 더미 항목을 업데이트합니다. 두 번째 정의에서. 더미 연산자를 사용하려는 경우 채워지기 전에 오류 메시지가 표시됩니다.

35.13.2. 부정관

the부정관조항, 제공된 경우 이름 연산자가 정의되는 부정관 인 연산자. 우리 운영자 A는 운영자 B의 부정 자라고 말하면 두 사람이 반환하는 경우 부울 결과 및 (x a y)는 가능한 모든 것에 대해 (x b y)와 동일하지 않습니다. 입력 x, y. B는 또한 A의 부정 자입니다. 예를 들어,<and =대부분의 데이터 유형에 대한 부정 쌍입니다. 운영자는 결코 할 수 없습니다 유효하게 자체 부정관이 되십시오.

정류자와 달리 한 쌍의 단독 운영자는 유효하게 서로의 부정관으로 표시됩니다. 그것은 (x)가 그렇지 않다는 것을 의미합니다 (B x) 모든 X의 경우 또는 오른쪽 단지 연산자의 경우

토토 베이의 부정자는 동일한 왼쪽 및/또는 오른쪽을 가져야합니다. 오페라는 정의 할 연산자로서 유형이므로와 마찬가지로Commutator, 연산자 이름 만 필요합니다 에 주어진부정관절.

부정기 제공은 쿼리 최적화에 매우 도움이됩니다. 와 같은 표현을 허용합니다.not (x = y)TO 단순화x < y. 이것 생각보다 더 자주 나타납니다.not결과로 작업을 삽입 할 수 있습니다 기타 재 배열.

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

35.13.3. 제한

the제한조항, 제공된 경우 이름 연산자에 대한 제한 선택성 추정 함수. (이것은 연산자 이름이 아닌 함수 이름입니다.)제한조항은 만 이해됩니다 반환되는 이진 연산자부울. 그만큼 제한 선택성 추정기의 아이디어는 무엇을 추측하는 것입니다. 테이블의 줄의 일부는 a를 만족시킬 것입니다.여기서-형식의 클레스트 조건 :

컬럼 OP Constant

현재 연산자 및 특정 상수 값의 경우. 이것 얼마나 많은 행이 될지에 대한 아이디어를 제공함으로써 Optimizer를 지원합니다. 에 의해 제거됩니다여기서이 형태. (상수가 왼쪽에 있으면 어떻게됩니까? 궁금해? 글쎄, 그게CommutatorIS for ...)

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

eqsel18623_18630=
neqselfor<
Scalarltselfor<또는<=
Scalargtselfor또는 =
이것이 카테고리라는 것이 조금 이상하게 보이지만 그들은 당신이 그것에 대해 생각한다면 이해하십시오.=의지 일반적으로 테이블에서 줄의 작은 부분 만 허용합니다.<일반적으로 a 작은 분수.<수락 할 것입니다 주어진 상수가 어디에 떨어지는 지에 따라 해당 테이블 열의 값 범위 (그렇습니다. 에 의해 수집 된 정보입니다.분석및 선택성 추정기에 사용할 수 있습니다).<=보다 약간 더 큰 분수를 받아 들일 것입니다<동일한 비교 상수에 대해서는 그들은 특히 구별 할 가치가 없을 정도로 충분히 가깝습니다 우리는 어쨌든 거친 추측보다 더 잘할 수 없기 때문입니다. 비슷한 발언이 적용and =.

당신은 자주 사용하여 자주 도망 갈 수 있습니다eqsel또는neqsel선택성이 매우 높거나 매우 낮은 토토 베이는 실제로 평등이나 불평등이 아닙니다. 예를 들어, 대략 평등 기하학적 토토 베이 사용eqsel보통 만 가능하다고 가정합니다 테이블의 항목의 작은 부분을 일치시킵니다.

사용할 수 있습니다ScalarltselScalargtsel데이터 비교 숫자로 변환되는 현명한 수단이있는 유형 범위 비교를위한 스칼라. 가능하면 데이터 유형을 추가하십시오 함수로 이해되는 것들convert_to_scalar ()insrc/backend/utils/adt/selfuncs.c. (결국 이것은 함수는 식별 된 데이터 당 기능으로 대체해야합니다 의 열을 통해PG_TYPE시스템 카탈로그; 하지만 아직 일어나지 않았습니다.) 당신이하지 않으면 이것은 여전히 ​​작동하지만 Optimizer의 추정치는 그들이 할 수있는만큼 좋다.

추가 선택성 추정 기능이 설계되었습니다 기하학적 토토 베이의 경우src/backend/utils/adt/geo_selfuncs.c: Areael, PositionselContsel. 이 글을 쓰는 동안 이건 그냥 스터브입니다. 그러나 당신은 그것들을 사용하고 싶을 수도 있습니다 (또는 더 나은 개선) 그래도.

35.13.4. Join

theJoin조항이 제공되는 경우 이름 a 연산자의 선택성 추정 기능에 가입하십시오. (그 점에 유의하십시오 이것은 연산자 이름이 아닌 함수 이름입니다.)Join조항은 이진 연산자에게만 적합합니다 그 반환부울. 가입의 아이디어 선택성 추정기는 한 쌍의 테이블이 a를 만족시킬 것입니다.여기서-Clause 양식의 상태 :

표 1.column1 op table2.column2

현재 연산자의 경우. 와 마찬가지로제한절, 이것은 최적화에 도움이됩니다 실질적으로 몇 가지 가능한 몇 가지 중 어느 것을 파악하게함으로써 가입 시퀀스는 최소한의 작업을 수행 할 가능성이 높습니다.

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

eqjoinselfor=
Neqjoinselfor<
scalarltjoinselfor<또는<=
Scalargtjoinselfor또는 =
AreaJoinsel2D 지역 기반 비교
PositionJoinsel2d 위치 기반 비교
contjoinsel2d 격리 기반 비교

35.13.5. 해시

the해시절이 참석하면 해시 조인 메소드를 사용하는 것이 허용되는 시스템 이 연산자를 기준으로 가입하십시오.해시만 반환하는 이진 연산자에게는 적합부울, 그리고 실제로 운영자는 대표해야합니다 일부 데이터 유형 또는 데이터 유형 쌍의 평등.

해시 조인의 기본 가정은 조인 연산자가 해시가하는 왼쪽 및 오른쪽 값 쌍에 대해서만 진정으로 반환 할 수 있습니다. 동일한 해시 코드에. 두 값이 다른 해시에 넣는 경우 버킷, 결합은 암시 적으로 전혀 비교하지 않습니다. 조인 연산자의 결과가 거짓이어야한다고 가정합니다. 그래서 지정하는 것이 의미가 없습니다해시어떤 형태의 평등을 나타내지 않는 운영자. 대부분 사례는 운영자의 해싱을 지원하는 것이 실용적입니다. 양쪽에서 동일한 데이터 유형을 취하십시오. 그러나 때로는 그렇습니다 둘 이상의 데이터에 대한 호환 해시 기능을 설계 할 수 있습니다. 유형; 즉, 동일한 해시 코드를 생성하는 기능 을 위한"Equal"값마다 표현이 다릅니다. 예를 들어, 그것은 공정합니다 다른 해시의 정수를 할 때이 속성을 배열하기는 간단합니다. 너비.

표시 될해시, 조인 연산자 해시 인덱스 운영자 제품군에 나타나야합니다. 이것은 시행되지 않습니다 물론 참조 이후로 연산자를 만들 때 운영자 가족은 아직 존재할 수 없었습니다. 그러나 사용 시도 해당 운영자가없는 경우 해시 조인의 운영자가 실행 시간에 실패합니다. 가족이 존재합니다. 시스템은 운영자 제품군이 운영자의 입력 데이터에 대한 데이터 유형 특이 적 해시 기능 타입. 물론 적절한 해시 함수를 만들어야합니다 운영자 제품군을 만들기 전에.

해시 기능을 준비 할 때 간호를 행사해야합니다. 기계에 따른 방법이 있습니다. 옳은 것. 예를 들어, 데이터 유형이 흥미롭지 않은 패드 비트가있을 수 있습니다. 전체 구조Hash_any. (하지 않는 한 다른 토토 베이와 기능을 작성하여 사용하지 않은 비트는 항상 0이며 권장 전략입니다.) 또 다른 예는를 충족하는 기계에서입니다.IEEE플로팅 포인트 표준, 네거티브 0 및 양의 0은 다른 값 (다른 비트 패턴)이지만 그것들은 평등하게 비교하도록 정의됩니다. 플로트 값에 포함될 수있는 경우 부정적인 0은 생성을 위해 추가 단계가 필요합니다. 긍정적 인 0과 동일한 해시 값.

해시-조용 가능한 연산자는 정류자가 있어야합니다 (자체 두 개의 피연산자 데이터 유형은 동일하거나 관련 평등 연산자입니다. 동일한 운영자 제품군에 나타나는 경우가 다릅니다. 만약에 그렇지 않은 경우, 운영자가있을 때 플래너 오류가 발생할 수 있습니다. 사용됩니다. 또한, 그것은 좋은 생각입니다 (그러나 엄격하게 필요하지 않은) 제공 할 여러 데이터 유형을 지원하는 해시 운영자 데이터 유형의 모든 조합에 대한 평등 연산자; 이것 더 나은 최적화를 허용합니다.

참고 :해시가 합류 가능한 연산자의 기본 기능 불변 또는 안정된 것으로 표시되어야합니다. 휘발성이면 시스템입니다 해시 조인에 연산자를 사용하려고 시도하지 않습니다.

참고 :해시가 합류 할 수있는 연산자에 기본이있는 경우 엄격하게 표시된 함수는 기능도 완료해야합니다. 즉, 두 사람에 대해 진실 또는 거짓을 반환해야합니다. unnull 입력. 이 규칙을 따르지 않으면 해시 최적화in운영이 잘못 될 수 있습니다 결과. (구체적으로,in돌아올 수 있습니다 표준에 따른 정답이있는 거짓 널; 또는 그것이 아니라고 불평하는 오류가 발생할 수 있습니다. 널 결과를위한 준비.)

35.13.6. 병합

the병합절이있는 경우, Merge-Join 메소드를 사용하는 것이 허용되는 시스템 이 연산자를 기반으로 한 가입.병합만 반환하는 이진 연산자에게는 적합부울그리고 실제로 운영자는 표현해야합니다 일부 데이터 유형 또는 데이터 유형 쌍의 평등.

병합 조인 오른쪽 테이블을 순서대로 정리 한 다음 병렬로 스캔합니다. 따라서 두 데이터 유형 모두 완전히 주문할 수 있어야하며 가입 연산자는 값 쌍에 대해서만 성공할 수있는 연산자 여야합니다. 가을에서"같은 장소"정렬 순서. 실제로 이것은 조인 연산자가해야한다는 것을 의미합니다 평등처럼 행동합니다. 그러나 두 가지 별개의 합병을 합병 할 수 있습니다 데이터가 논리적으로 호환되는 한 데이터 유형. 예를 들어, 그만큼smallint-ersus-정수평등 연산자는 합병 가능합니다. 우리 만 두 데이터 유형을 모두로 가져 오는 정렬 연산자가 필요합니다. 논리적으로 호환되는 순서.

표시 될병합, 조인 연산자 A의 평등 멤버로 나타나야합니다btree색인 토토 베이 패밀리. 이것은 시행되지 않습니다 물론 참조 이후로 연산자를 만들 때 토토 베이 가족은 아직 존재할 수 없었습니다. 그러나 토토 베이는 그렇지 않을 것입니다 일치하는 토토 베이 제품군이 아니라면 실제로 합병 결합에 사용됩니다. 찾을 수 있습니다. 그만큼병합플래그는 다음과 같이 작용합니다 플래너에게 일치하는 것을 찾을 가치가 있다는 힌트 운영자 가족.

병합 합류 가능한 연산자는 정류자가 있어야합니다 (자체 두 개의 피연산자 데이터 유형은 동일하거나 관련 평등 연산자입니다. 동일한 운영자 제품군에 나타나는 경우가 다릅니다. 만약에 그렇지 않은 경우, 운영자가있을 때 플래너 오류가 발생할 수 있습니다. 사용됩니다. 또한 A에 대한 좋은 생각 (그러나 엄격하게 필요하지는 않습니다).btree토토 베이 제품군 모든 데이터 유형은 모든 평등 연산자를 제공합니다 데이터 유형의 조합; 이것은 더 나은 최적화를 허용합니다.

참고 :병합 가능한 연산자의 기본 기능 불변 또는 안정된 것으로 표시되어야합니다. 휘발성이면 시스템입니다 병합 조인에 연산자를 사용하려고 시도하지 않습니다.