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

35.13. 운영자 최적화 정보

A PostgreSQL연산자 정의에는 다음을 알려주는 여러 선택적 절이 포함될 수 있습니다. 운영자의 행동 방식에 대한 시스템 유용한 정보. 이 조항 필요할 때마다 제공되어야 합니다. 쿼리 실행 속도가 상당히 빨라졌습니다. 운영자. 하지만 제공하는 경우 해당 정보가 다음과 같은지 확인해야 합니다. 맞아! 최적화 절을 잘못 사용하면 속도가 느려질 수 있습니다. 쿼리, 미묘하게 잘못된 출력 또는 기타 나쁜 것들. 당신은 항상 할 수 있습니다 확실하지 않은 경우 최적화 절을 생략하십시오. 는 유일한 결과는 쿼리가 필요한 것보다 느리게 실행될 수 있다는 것입니다. 에.

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

35.13.1. 커뮤테이터

커뮤테이터절(제공된 경우) 연산자의 정류자인 연산자의 이름을 지정합니다. 정의되었습니다. 다음과 같은 경우 연산자 A는 연산자 B의 정류자라고 합니다. (x A y)는 가능한 모든 입력 값 x, y에 대해 (y B x)와 같습니다. 공지사항 B는 A의 정류자이기도 합니다. 예를 들어, 연산자<그리고용 특정 데이터 유형은 일반적으로 서로의 정류자이며 토토 베이+일반적으로 다음과 교환 가능합니다. 그 자체. 하지만 운영자-보통 그렇지 않습니다 무엇이든 교환 가능합니다.

교환 가능한 연산자의 왼쪽 피연산자 유형은 다음과 같습니다. 정류자의 올바른 피연산자 유형, 그 반대의 경우. 그래서 정류자 연산자의 이름이 전부입니다.포스트그레SQL조회하려면 제공되어야 합니다. 정류자, 이것이 바로 제공되어야 하는 전부입니다.커뮤테이터절.

연산자에게 정류자 정보를 제공하는 것이 중요합니다 이는 인덱스 및 조인 절에 사용됩니다. 쿼리 최적화 프로그램은"뒤집기"다양한 계획 유형에 필요한 양식에 대한 이러한 조항입니다. 에 대한 예를 들어, 다음과 같은 WHERE 절이 있는 쿼리를 생각해 보세요.tab1.x = tab2.y, 여기서tab1.x그리고tab2.y이것은 사용자 정의 유형이라고 가정합니다.tab2.y인덱싱되었습니다. 옵티마이저는 인덱스 스캔을 생성하지 않는 한 인덱스 스캔을 생성할 수 없습니다. 절을 뒤집는 방법을 결정할 수 있습니다.tab2.y = tab1.x, 인덱스 스캔 기계 때문에 토토 베이 왼쪽에 인덱싱된 열이 표시될 것으로 예상합니다. 주어졌습니다.PostgreSQL할 것이다아님단순히 가정해 보세요 이것은 유효한 변환입니다. — 작성자는=연산자는 다음을 표시하여 그것이 유효함을 지정해야 합니다. 정류자 정보가 있는 연산자입니다.

자기 교환 연산자를 정의할 때 다음을 수행하면 됩니다. 그것. 교환 연산자 쌍을 정의할 때 조금 더 까다롭습니다. 정의할 첫 번째 항목은 어떻게 참조할 수 있나요? 아직 정의하지 않은 다른 하나는 무엇입니까? 두 가지가 있습니다 이 문제에 대한 해결책:

  • 한 가지 방법은 다음을 생략하는 것입니다.커뮤테이터정의한 첫 번째 연산자에 절을 추가한 다음 하나를 제공하세요. 두 번째 연산자의 정의에서. 이후포스트그레SQL교환 토토 베이를 알고 있습니다 쌍으로 와서 두 번째 정의를 보면 자동으로 돌아가서 누락된 부분을 채워주세요커뮤테이터첫 번째 정의의 절.

  • 다른 더 간단한 방법은 다음을 포함하는 것입니다.커뮤테이터두 정의 모두에 절이 있습니다. 언제PostgreSQL처리합니다 첫 번째 정의 및 실현커뮤테이터존재하지 않는 연산자를 나타냅니다. 시스템은 시스템에서 해당 운영자에 대한 더미 항목을 만듭니다. 카탈로그. 이 더미 항목에는 다음 항목에 대해서만 유효한 데이터가 있습니다. 연산자 이름, 왼쪽 및 오른쪽 피연산자 유형, 결과 유형 그게 다야포스트그레SQL할 수 있다 이 시점에서 추론해 보세요. 첫 번째 운영자의 카탈로그 항목이 링크됩니다. 이 더미 항목에. 나중에 두 번째 연산자를 정의할 때 시스템은 추가 정보로 더미 항목을 업데이트합니다. 두 번째 정의부터. 더미 연산자를 사용하려고 하면 채워지기 전에 오류 메시지가 표시됩니다.

35.13.2. NEGATOR

NEGATOR절(제공된 경우) 이름 정의되는 토토 베이의 부정자인 토토 베이. 우리 둘 다 반환되면 토토 베이 A는 토토 베이 B의 부정자라고 가정합니다. 부울 결과 및 (x A y)는 가능한 모든 항목에 대해 NOT (x B y)와 같습니다. x, y를 입력합니다. B는 A의 부정자이기도 합니다. 예를 들어,<그리고=는 대부분의 데이터 유형에 대한 부정자 쌍입니다. 토토 베이는 절대로 할 수 없습니다. 유효하게 자신의 부정자가 될 수 있습니다.

정류자와 달리 단항 토토 베이 쌍은 유효할 수 있습니다. 서로의 부정자로 표시됩니다. 이는 (A x)가 NOT과 같음을 의미합니다. (B x) 모든 x에 대해 또는 오른쪽 단항 토토 베이에 해당합니다.

토토 베이의 부정자는 왼쪽 및/또는 오른쪽이 동일해야 합니다 피토토 베이 유형을 정의할 토토 베이로 사용하므로 with와 마찬가지로커뮤테이터, 토토 베이 이름만 있으면 됩니다. 에 주어진NEGATOR절.

부정자를 제공하는 것은 쿼리 최적화 프로그램에 매우 도움이 됩니다. 다음과 같은 표현이 가능합니다.NOT (x = y)에 단순화되다x < y. 이 생각보다 자주 나오거든요. 왜냐하면아님작업은 다음의 결과로 삽입될 수 있습니다. 기타 재배치.

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

35.13.3. 제한

제한절, 제공된 경우 이름 운영자를 위한 제한 선택성 추정 함수. (이것은 연산자 이름이 아닌 함수 이름입니다.)제한절은 다음에 대해서만 의미가 있습니다. 반환하는 이항 연산자부울. 는 제한 선택성 추정기의 기본 아이디어는 무엇을 추측하는 것입니다. 테이블의 행 중 일부는 다음을 만족합니다.어디-양식의 절 조건:

열 OP 상수

현재 연산자 및 특정 상수 값에 대해. 이 얼마나 많은 행이 실행될 것인지에 대한 아이디어를 제공하여 최적화 프로그램을 지원합니다. 다음으로 탈락하다어디다음을 포함하는 절 이 양식. (상수가 왼쪽에 있으면 어떻게 될까요? 궁금해? 글쎄요, 그게 바로 그 일 중 하나입니다.커뮤테이터다음을 위한 것입니다...)

새로운 제한 선택성 추정 함수를 작성하는 것은 멀었습니다 이 장의 범위를 벗어나지만 다행히도 일반적으로 다음을 수행할 수 있습니다. 많은 경우에 대해 시스템의 표준 추정기 중 하나를 사용하십시오. 자신의 운영자. 다음은 표준 제한 추정기입니다.

eqselfor=
네크셀for<
scalarltselfor<또는<=
scalargtselfor또는=
이것이 카테고리라는 것이 조금 이상해 보일 수도 있지만, 생각해 보면 이해가 되실 겁니다.=할 것이다 일반적으로 테이블 행의 작은 부분만 허용합니다.<일반적으로 다음 항목만 거부합니다. 작은 부분.<다음을 수락합니다 주어진 상수가 어디에 속하는지에 따라 달라지는 분수 해당 테이블 열의 값 범위(이런 일이 발생하면 에서 수집한 정보입니다.분석그리고 선택성 추정기에 사용할 수 있음).<=다음보다 약간 더 큰 분수를 허용합니다<동일한 비교 상수에 대해, 그러나 특히 구별할 가치가 없을 정도로 가깝습니다. 어쨌든 우리는 대략적인 추측보다 더 나은 결과를 얻을 가능성이 없기 때문입니다. 유사한 설명이 다음에 적용됩니다.그리고=.

둘 중 하나를 사용하면 자주 벗어날 수 있습니다.eqsel또는네크셀용 선택성이 매우 높거나 매우 낮은 토토 베이 실제로는 평등도 불평등도 아닙니다. 예를 들어, 근사 평등 기하학 토토 베이 사용eqsel그들은 일반적으로 테이블에 있는 항목의 작은 부분과 일치합니다.

당신은 사용할 수 있습니다scalarltsel그리고scalargtsel데이터 비교용 숫자로 변환할 수 있는 합리적인 수단이 있는 유형 범위 비교를 위한 스칼라. 가능하다면 데이터 유형을 함수로 이해되는 것convert_to_scalar()src/backend/utils/adt/selfuncs.c. (결국 이 함수는 식별된 데이터 유형별 함수로 대체되어야 합니다. 의 열을 통해pg_type시스템 카탈로그; 하지만 그런 일은 아직 일어나지 않았습니다.) 그렇게 하지 않으면 이 경우에는 여전히 작동하지만 최적화 프로그램의 추정치는 작동하지 않습니다. 최대한 잘 지내라.

추가 선택성 추정 기능이 설계되었습니다. 기하 토토 베이의 경우src/backend/utils/adt/geo_selfuncs.c: areasel, positionsel콘셀. 이 글을 쓰는 시점에서 이것들은 단지 스텁일 뿐입니다. 하지만 이를 사용하고 싶을 수도 있습니다(또는 개선하는 것이 더 좋습니다). 어쨌든.

35.13.4. 가입

가입절, 제공된 경우 이름을 지정합니다. 토토 베이에 대한 조인 선택성 추정 기능. (참고하세요 이는 토토 베이 이름이 아닌 함수 이름입니다.)가입절은 이진 토토 베이에만 의미가 있습니다. 그 반환부울. 조인의 기본 아이디어 선택성 추정기는 행의 몇 부분을 추측하는 것입니다. 테이블 쌍은 a를 만족합니다.어디-절 양식의 조건:

table1.column1 OP table2.column2

현재 연산자에 대한 것입니다. 와 마찬가지로제한절, 이는 최적화 프로그램에 매우 도움이 됩니다. 실질적으로 가능한 여러 가지 중 어느 것이 무엇인지 알아내도록 함으로써 조인 시퀀스는 최소한의 작업만 수행할 가능성이 높습니다.

이전과 마찬가지로 이 장에서는 조인 선택성 추정 함수를 작성하지만 단지 제안만 할 것입니다. 다음과 같은 경우 표준 추정기 중 하나를 사용합니다. 해당:

eqjoinselfor=
neqjoinselfor<
scalarltjoinsel<또는<=
scalargtjoinselfor또는=
areajoinsel23077_23109
positionjoinsel23173_23209
contjoinsel23269_23308

35.13.5. 해시

해시절이 있는 경우 다음을 나타냅니다. 해시 조인 방식을 사용하는 것이 허용되는 시스템 이 연산자를 기준으로 조인하세요.해시만 반환하는 이진 토토 베이에 적합합니다.부울, 실제로 연산자는 다음을 나타내야 합니다. 일부 데이터 유형 또는 데이터 유형 쌍에 대한 동일성.

해시 조인의 기본 가정은 조인 연산자가 해시된 왼쪽 및 오른쪽 값 쌍에 대해서만 true를 반환할 수 있습니다. 동일한 해시 코드로. 두 값이 서로 다른 해시에 입력되는 경우 버킷의 경우 조인은 암시적으로 버킷을 전혀 비교하지 않습니다. 조인 연산자의 결과가 거짓이어야 한다고 가정합니다. 그래서 지정하는 것은 결코 의미가 없습니다해시용 어떤 형태의 동등성을 나타내지 않는 연산자. 대부분의 경우 경우에 따라 다음과 같은 연산자에 대해 해싱을 지원하는 것이 실용적입니다. 양쪽에서 동일한 데이터 유형을 사용합니다. 그러나 때로는 그렇습니다. 두 개 이상의 데이터에 대해 호환 가능한 해시 함수 설계 가능 유형; 즉, 동일한 해시 코드를 생성하는 함수입니다. 에 대한"같음"값, 비록 값은 다르게 표현됩니다. 예를 들면 상당히 다양한 정수를 해싱할 때 이 속성을 간단하게 정렬할 수 있습니다. 너비.

표시 예정해시, 조인 연산자 해시 인덱스 연산자 계열에 나타나야 합니다. 이는 시행되지 않습니다. 연산자를 생성할 때 물론 참조 이후 운영자 제품군은 아직 존재할 수 없습니다. 그러나 다음을 사용하려고 시도합니다. 해시 조인의 연산자는 해당 연산자가 없으면 런타임에 실패합니다. 가족이 존재합니다. 시스템에서는 운영자 가족이 다음을 찾아야 합니다. 연산자의 입력 데이터에 대한 데이터 유형별 해시 함수 유형. 물론 적절한 해시 함수도 만들어야 합니다. 연산자 계열을 만들기 전에.

해시 함수를 준비할 때는 주의해야 합니다. 왜냐하면 기계에 따라 실패할 수 있는 방법이 있습니다. 옳은 것. 예를 들어, 데이터 유형이 다음과 같은 구조인 경우 흥미롭지 않은 패드 비트가 있을 수 있으므로 단순히 통과할 수는 없습니다. 전체 구조를hash_any. (만약 다른 연산자와 함수를 작성하여 사용되지 않은 비트는 항상 0이며 이는 권장되는 전략입니다.) 또 다른 예는 다음을 충족하는 머신의 경우입니다.IEEE부동 소수점 표준, 음수 0 및 양의 0은 다른 값(다른 비트 패턴)이지만 그들은 동등함을 비교하도록 정의됩니다. 부동 소수점 값에 다음이 포함될 수 있는 경우 음수 0이면 생성을 보장하기 위해 추가 단계가 필요합니다. 양수 0과 동일한 해시 값입니다.

해시 조인 가능 연산자에는 정류자가 있어야 합니다. 두 피연산자 데이터 유형이 동일하거나 관련된 항등 연산자 다른 경우) 동일한 연산자 계열에 나타납니다. 만약에 그렇지 않으면 플래너 오류가 발생할 수 있습니다. 사용됩니다. 또한, 이는 좋은 생각입니다(그러나 엄격하게 요구되는 것은 아닙니다). 다양한 데이터 유형을 지원하는 해시 연산자 제품군 모든 데이터 유형 조합에 대한 항등 연산자; 이 더 나은 최적화가 가능합니다.

참고:해시 조인 가능 연산자의 기본 함수 immutable 또는 stable로 표시되어야 합니다. 휘발성이라면 시스템은 해시 조인에 연산자를 사용하려고 시도하지 않습니다.

참고:해시 조인 가능 연산자에 기본이 있는 경우 strict로 표시된 함수는 완전해야 합니다. 즉, 두 가지 모두에 대해 true 또는 false를 반환해야 하며 결코 null이 아니어야 합니다. 널이 아닌 입력. 이 규칙을 따르지 않으면 해시 최적화IN작업이 잘못 생성될 수 있음 결과. (구체적으로는,IN돌아올 수도 있음 표준에 따른 정답이 거짓인 경우 널; 아니면 그렇지 않다고 불평하는 오류가 발생할 수도 있습니다. null 결과에 대비했습니다.)

35.13.6. 병합

병합절이 있는 경우 다음을 나타냅니다. 병합 조인 방법을 사용하는 것이 허용되는 시스템 이 연산자를 기반으로 한 조인입니다.병합만 반환하는 이진 토토 베이에 적합합니다.부울, 실제로 연산자는 다음을 나타내야 합니다. 일부 데이터 유형 또는 데이터 유형 쌍에 대한 동일성.

병합 조인은 왼쪽 및 오른쪽 정렬 아이디어를 기반으로 합니다. 오른쪽 테이블을 순서대로 정렬한 다음 병렬로 스캔합니다. 따라서 두 데이터 유형 모두 완전히 정렬될 수 있어야 하며 조인 연산자는 값 쌍에 대해서만 성공할 수 있는 연산자여야 합니다. 그 가을에"같은 장소"안에 정렬 순서. 실제로 이는 조인 연산자가 다음을 수행해야 함을 의미합니다. 평등하게 행동하세요. 그러나 두 개의 별개의 병합 조인이 가능합니다. 논리적으로 호환되는 데이터 유형입니다. 예를 들어,작은int-대-정수항등 연산자는 병합 조인이 가능합니다. 우리만 두 데이터 유형을 모두 가져오는 정렬 연산자가 필요합니다. 논리적으로 호환되는 시퀀스입니다.

표시 예정병합, 조인 토토 베이 a의 동등 멤버로 나타나야 합니다.브트리색인 연산자 계열. 이는 시행되지 않습니다. 연산자를 생성할 때 물론 참조 이후 운영자 제품군은 아직 존재할 수 없습니다. 하지만 운영자는 그렇지 않습니다. 일치하는 연산자 계열이 아닌 한 실제로 병합 조인에 사용됩니다. 찾을 수 있습니다.병합플래그는 다음과 같이 작동합니다. 일치하는 항목을 찾을 가치가 있다는 힌트를 플래너에게 제공 연산자 계열.

병합 조인이 가능한 연산자에는 정류자가 있어야 합니다. 두 피연산자 데이터 유형이 동일하거나 관련된 항등 연산자 다른 경우) 동일한 연산자 계열에 나타납니다. 만약에 그렇지 않으면 플래너 오류가 발생할 수 있습니다. 사용됩니다. 또한 a에 대한 좋은 아이디어입니다(그러나 엄격히 요구되는 것은 아닙니다).브트리지원하는 연산자 제품군 여러 데이터 유형에 대해 항등 연산자를 제공합니다. 데이터 유형의 조합; 이를 통해 더 나은 최적화가 가능합니다.

참고:병합 조인 가능 연산자의 기본 기능 immutable 또는 stable로 표시되어야 합니다. 휘발성이라면 시스템은 병합 조인에 연산자를 사용하려고 시도하지 않습니다.