A PostgreSQL토토 꽁 머니 정의에는 시스템에 작동 방식에 대한 유용한 내용을 알려주는 몇 가지 선택 조항이 포함될 수 있습니다. 이 조항은 연산자를 사용하는 쿼리를 실행할 때 상당한 속도를 높일 수 있기 때문에 적절할 때마다 제공되어야합니다.
추가 최적화 조항이 향후 버전의에 추가 될 수 있습니다.PostgreSQL. 여기에 설명 된 것은 17.4가 이해하는 모든 것입니다.
플래너 지원 기능을 연산자의 기초가되는 기능에 첨부 할 수도 있고, 시스템에 운영자의 동작에 대해 시스템에 알려주는 다른 방법을 제공 할 수도 있습니다. 보다섹션 36.11자세한 내용은
Commutator
#theCommutator
조항이 제공된 경우, 정의되는 연산자의 정류자 인 연산자의 이름을 지정합니다. 우리는 토토 꽁 머니 A가 가능한 모든 입력 값 x, y에 대해 (x a y)와 동일하게 (y b x) 연산자 b의 정류자라고 말합니다.<
and특정 데이터 유형의 경우 일반적으로 서로의 정류자 및 연산자
+
는 일반적으로 그 자체로 정류됩니다. 그러나 토토 꽁 머니-
보통 아무것도 통근하지 않습니다.
통근 가능한 연산자의 왼쪽 피연산자 유형은 정류자의 오른쪽 피연산자 유형과 동일하며 그 반대도 마찬가지입니다. 그래서 정류자 토토 꽁 머니의 이름이 그 모든 것입니다PostgreSQL정류자를 찾기 위해 제공되어야합니다.Commutator
조항
인덱스에 사용될 연산자에게 통근자 정보를 제공하고 조항에 가입하는 것이 중요합니다. Query Optimizer가가 허용되기 때문입니다.“뒤집어”다른 계획 유형에 필요한 양식에 대한 그러한 조항. 예를 들어, where 절이있는 쿼리를 고려하십시오.tab1.x = tab2.y
, 여기tab1.x
andtab2.y
사용자 정의 유형이며tab2.y
색인이 표시됩니다. Optimizer는 조항을 뒤집는 방법을 결정할 수 없다면 인덱스 스캔을 생성 할 수 없습니다.tab2.y = tab1.x
, 인덱스 스캔 기계는 연산자의 왼쪽에 인덱스 된 열이 표시되기 때문에..PostgreSQLWillnot이것이 유효한 변환이라고 가정합니다.=
토토 꽁 머니는 토토 꽁 머니에게 정류자 정보를 표시하여 유효하도록 지정해야합니다.
부정관
#the부정관
조항이 제공된 경우 조작자의 부정인 인 연산자의 이름을 정의합니다. 우리는 부울 결과를 반환하고 (x a y)가 가능한 모든 입력 x, y에 대해 (x b y)와 같지 않은 경우 연산자 A가 연산자 B의 부정 자라고 말합니다.<
and> =
는 대부분의 데이터 유형에 대한 부정적인 쌍입니다. 토토 꽁 머니는 결코 자신의 부정자가 될 수 없습니다.
정류자와 달리 한 쌍의 단독 운영자는 서로의 부정관으로 유효하게 표시 될 수 있습니다. 즉, (a x)는 모든 x.에 대해 (b x)와 동일하다는 것을 의미합니다.
토토 꽁 머니의 부정자는 정의 할 연산자와 동일한 왼쪽 및/또는 오른쪽 피연산자 유형을 가져야합니다.Commutator
부정관
조항
부정기를 제공하는 것은 쿼리 최적화에 매우 도움이됩니다.NOT (x = y)
단순화하려면x <> y
. 이것은 당신이 생각하는 것보다 더 자주 나타납니다.아님
다른 재 배열의 결과로 작업을 삽입 할 수 있습니다.
제한
#the제한
조항이 제공된 경우 조작자에 대한 제한 선택성 추정 함수의 이름을 지정합니다. (이것은 연산자 이름이 아닌 함수 이름입니다.)제한
클로즈는 반환되는 이진 연산자에게만 적합합니다부울
. 제한 선택성 추정기의 배후에있는 아이디어는 테이블의 행의 일부가 A를 만족시킬 것인지 추측하는 것입니다.여기서
-양식의 클레스트 조건 :
컬럼 OP Constant
현재 연산자 및 특정 상수 값의 경우. 이것은옵니다.여기서
이 양식을 가진 조항. (상수가 왼쪽에 있다면 어떻게 될까요? 궁금 할 것입니다. 글쎄요Commutator
새로운 제한 선택성 추정 기능 작성은이 장의 범위를 훨씬 능가하지만 다행히도 일반적으로 많은 자신의 운영자에게 시스템의 표준 추정기 중 하나를 사용할 수 있습니다. 표준 제한 추정기입니다.
eqsel for= |
neqsel for< |
Scalarltsel for< |
Scalarlesel for<= |
Scalargtsel for
|
Scalargesel for> = |
당신은 자주 사용하여 자주 도망 갈 수 있습니다eqsel
또는neqsel
실제로 평등이나 불평등이 아니더라도 선택성이 매우 높거나 매우 낮은 토토 꽁 머니의 경우. 예를 들어, 대략적인 기하학적 연산자가 사용eqsel
일반적으로 테이블의 항목의 작은 부분 만 일치 할 것이라고 가정합니다.
사용할 수 있습니다Scalarltsel
, Scalarlesel
, Scalargtsel
andScalargesel
범위 비교를 위해 숫자 스칼라로 변환되는 합리적인 수단을 가진 데이터 유형에 대한 비교. 가능하면 기능으로 이해되는 데이터 유형에 데이터 유형을 추가하십시오convert_to_scalar ()
insrc/backend/utils/adt/selfuncs.c
. (결국,이 기능은의 열을 통해 식별 된 데이터 당 기능으로 대체되어야합니다.pg_type
시스템 카탈로그; 그러나 그것은 아직 일어나지 않았습니다.)이 작업을 수행하지 않으면 상황이 여전히 작동하지만 Optimizer의 추정치는 가능하지 않습니다.
또 다른 유용한 내장 선택성 추정 함수는입니다.Matchingsel
, 표준 MCV 및/또는 히스토그램 통계가 입력 데이터 유형에 대해 수집되는 경우 거의 모든 이진 연산자에게 작동합니다. 기본 추정치는에서 사용 된 기본 추정치의 두 배로 설정됩니다.eqsel
, 평등보다 다소 엄격한 비교 연산자에게 가장 적합합니다. (또는 기본 전화를 할 수 있습니다generic_restriction_selectivity
다른 기본 추정치를 제공하는 함수)
기하학적 연산자를 위해 설계된 추가 선택성 추정 기능이 있습니다src/backend/utils/adt/geo_selfuncs.c
: Areael
, Positionsel
및Contsel
. 이 글을 쓰면 이것들은 단지 스터브 일 뿐이지 만, 당신은 그들을 사용하고 싶을 수도 있습니다 (또는 더 나은 개선).
Join
#theJoin
조항이 제공되는 경우 조작자에 대한 조인 선택성 추정 함수의 이름을 지정합니다. (이것은 연산자 이름이 아닌 함수 이름입니다.)Join
클로즈는 반환되는 이진 연산자에게만 적합합니다부울
. 결합 선택성 추정기의 아이디어는 한 쌍의 테이블의 행의 일부가 A를 만족시킬 것인지 추측하는 것입니다.여기서
-양식의 클레스트 조건 :
표 1.column1 op table2.column2
현재 연산자의 경우. 와 마찬가지로제한
절, 이것은 가능한 몇 가지 가능한 조인 시퀀스 중 어느 것이 가장 적은 작업을 수행 할 수 있는지 알아 내면서 최적화를 매우 실질적으로 도움이됩니다.
이전과 마찬가지로,이 장에서는 결합 선택성 추정기 기능을 작성하는 방법을 설명하려고 시도하지 않지만 적용 가능한 경우 표준 추정기 중 하나를 사용하는 것이 좋습니다..
eqjoinsel for= |
Neqjoinsel for< |
scalarltjoinsel for< |
Scalarlejoinsel for<= |
Scalargtjoinsel for
|
Scalargejoinsel for> = |
MatchingJoinsel 일반 일치 연산자 |
AreaJoinsel 2D 지역 기반 비교 용 |
PositionJoinsel 2D 위치 기반 비교 용 |
contjoinsel 2D 격리 기반 비교 용 |
해시
#the해시
clause는 현재이 연산자를 기반으로 조인에 대한 해시 조인 메소드를 사용하는 것이 허용되는 시스템에 알려줍니다..해시
반환하는 이진 연산자에게만 적합합니다부울
, 그리고 실제로 운영자는 일부 데이터 유형 또는 데이터 유형 쌍의 평등을 나타내야합니다.
해시 조인의 기본 가정은 조인 연산자가 동일한 해시 코드에 해시를하는 왼쪽 및 오른쪽 값 쌍에 대해서만 true를 반환 할 수 있다는 것입니다. 두 값이 다른 해시 버킷에 넣는 경우 조인 연산자의 결과가 거짓이어야한다고 가정하면, 조인은 전혀 비교하지 않습니다.해시
어떤 형태의 평등을 나타내지 않는 운영자. 대부분의 경우 양쪽에서 동일한 데이터 유형을 취하는 연산자의 해싱을 지원하는 것은 실용적입니다.“Equal”값은 다른 표현을 가지고 있지만 값. 예를 들어, 다른 너비의 해시를 해싱 할 때이 속성을 배열하는 것은 상당히 간단합니다.
표시 될해시
, 가입 연산자는 해시 지수 운영자 제품군에 나타나야합니다. 물론 참조 연산자 제품군은 아직 존재할 수 없었기 때문에 연산자를 만들 때 시행되지 않습니다.
해시 기능을 준비 할 때는주의를 기울여야합니다. 옳은 일을하지 못하는 기계에 의존하는 방법이 있기 때문입니다. 예를 들어, 데이터 유형이 흥미롭지 않은 패드 비트가있을 수있는 구조 인 경우 전체 구조를 간단히 전달할 수는 없습니다.hash_any
. (다른 토토 꽁 머니와 기능을 작성하지 않으면 사용하지 않은 비트가 항상 0이되도록 권장되는 전략입니다.) 또 다른 예는를 충족하는 기계에서입니다.IEEE플로팅 포인트 표준, 음수 0 및 양의 0은 다른 값 (다른 비트 패턴)이지만 동일하게 비교하도록 정의됩니다. 플로트 값에 음수 0이 포함될 수있는 경우, 동일한 해시 값을 양수 0과 생성하기 위해 추가 단계가 필요합니다.
해시 합의 가능한 연산자에게는 동일한 운영자 제품군에 나타나는 두 개의 피연산자 데이터 유형이 동일하거나 관련 평등 조작자가 동일하거나 관련 평등 연산자 자체가 있어야합니다. 그렇지 않은 경우 작업자가 사용될 때 플래너 오류가 발생할 수 있습니다.
해시-접합 가능한 연산자의 기본 기능은 불변하거나 안정적으로 표시되어야합니다. 휘발성이면 시스템은 해시 조인에 연산자를 사용하려고 시도하지 않습니다.
해시-접합 가능한 연산자가 엄격하게 표시되는 기본 기능이 있으면 함수도 완료해야합니다. 즉, 두 개의 unnull 입력에 대해 true 또는 false, null을 반환하지 않아야합니다. 이 규칙을 따르지 않으면 해시 최적화in
운영은 잘못된 결과를 생성 할 수 있습니다. (구체적으로,in
표준에 따른 정답이 널이 될 경우 거짓을 반환 할 수 있습니다. 또는 널 결과를 위해 준비되지 않았다고 불평하는 오류가 발생할 수 있습니다.)
병합
#the병합
절은 현재 현재이 연산자를 기반으로 결합에 합병 결합 메소드를 사용하는 것이 허용되는 시스템에 알려줍니다..병합
반환하는 이진 연산자에게만 적합합니다부울
, 그리고 실제로 운영자는 일부 데이터 유형 또는 데이터 유형 쌍의 평등을 나타내야합니다.
병합 조인은 왼쪽 및 오른쪽 테이블을 순서대로 정렬 한 다음 병렬로 스캔하는 아이디어를 기반으로합니다. 따라서 두 데이터 유형 모두 완전히 주문할 수 있어야하며 조인 연산자는에 해당하는 값 쌍에 대해서만 성공할 수있는 조인 연산자 여야합니다.“같은 장소”정렬 순서로. 실제로 이것은 조인 연산자가 평등처럼 행동해야 함을 의미합니다.smallint
-ersus-Integer
평등 연산자는 합병 가능합니다. 우리는 두 데이터 유형을 모두 논리적으로 호환 가능한 순서로 가져 오는 정렬 연산자 만 필요합니다.
표시 될병합
, 가입 연산자는 A의 평등 멤버로 나타나야합니다btree
인덱스 토토 꽁 머니 패밀리. 물론 참조 연산자 제품군은 아직 존재할 수 없었기 때문에 연산자를 만들 때 시행되지 않습니다.병합
플래그는 일치하는 토토 꽁 머니 제품군을 찾고 있다는 플래너에게 힌트 역할을합니다.
병합 가능한 연산자에게는 동일한 운영자 제품군에 나타나는 두 개의 피연산자 데이터 유형이 동일하거나 관련 평등 조작자가 동일하거나 관련 평등 연산자 자체가 있어야합니다. 그렇지 않은 경우 작업자가 사용될 때 플래너 오류가 발생할 수 있습니다.btree
다중 데이터 유형을 지원하여 데이터 유형의 모든 조합에 대한 평등 연산자를 제공하는 운영자 제품군; 이것은 더 나은 최적화를 허용합니다.
병합 합의 가능한 연산자의 기본 기능은 불변하거나 안정적으로 표시되어야합니다. 휘발성이면 시스템은 합병 조인에 연산자를 사용하지 않습니다..
문서에 올바른 것이없는 것이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면