36.15. 운영자 최적화 정보#

A 포스트그레SQL연산자 정의에는 연산자의 작동 방식에 대한 유용한 정보를 시스템에 알려주는 여러 선택적 절이 포함될 수 있습니다. 이러한 절은 연산자를 사용하는 쿼리 실행 속도를 상당히 높일 수 있으므로 필요할 때마다 제공해야 합니다. 하지만 제공한다면 그 내용이 맞는지 확인해야 합니다! 최적화 절을 잘못 사용하면 쿼리가 느려지거나 미묘하게 잘못된 출력이 발생하거나 기타 나쁜 상황이 발생할 수 있습니다. 확실하지 않은 경우 언제든지 최적화 절을 생략할 수 있습니다. 유일한 결과는 쿼리가 필요한 것보다 느리게 실행될 수 있다는 것입니다.

추가 최적화 조항은 향후 버전에 추가될 수 있습니다.포스트그레SQL. 여기에 설명된 내용은 릴리스 18.0에서 이해되는 모든 내용입니다.

또한 운영자의 기본 기능에 플래너 지원 기능을 첨부하여 운영자의 행동에 대해 시스템에 알리는 또 다른 방법을 제공할 수도 있습니다. 참조PostgreSQL : 문서 : 18 : 36.11. 토토 결과 최적화 정보더 많은 정보를 원하시면.

36.15.1. 커뮤테이터 #

커뮤테이터절이 제공되면 정의 중인 범퍼카 토토의 정류자인 범퍼카 토토의 이름을 지정합니다. 가능한 모든 입력 값 x, y에 대해 (x A y)가 (y B x)와 같을 경우 범퍼카 토토 A는 범퍼카 토토 B의 정류자라고 말합니다. B는 A의 정류자이기도 합니다. 예를 들어, 범퍼카 토토<그리고특정 데이터 유형의 경우 일반적으로 서로의 정류자와 범퍼카 토토가 있습니다.+은 일반적으로 그 자체로 교환 가능합니다. 하지만 범퍼카 토토-일반적으로 어떤 것과도 교환 가능하지 않습니다.

변경 가능한 범퍼카 토토의 왼쪽 피범퍼카 토토 유형은 정류자의 오른쪽 피범퍼카 토토 유형과 동일하며 그 반대도 마찬가지입니다. 따라서 정류자 범퍼카 토토의 이름은 그게 전부입니다.PostgreSQL정류자를 찾기 위해 제공되어야 하며, 이것이 제공되어야 하는 전부입니다.커뮤테이터절.

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

36.15.2. NEGATOR #

NEGATOR절이 제공되면 정의 중인 범퍼카 토토의 부정자인 범퍼카 토토의 이름을 지정합니다. 가능한 모든 입력 x, y에 대해 둘 다 부울 결과를 반환하고 (x A y)가 NOT (x B y)인 경우 범퍼카 토토 A는 범퍼카 토토 B의 부정자라고 말합니다. B는 A의 부정자이기도 합니다. 예를 들어,<그리고=은 대부분의 데이터 유형에 대한 부정자 쌍입니다. 범퍼카 토토는 자신의 부정자가 될 수 없습니다.

정류자와는 달리, 단항 범퍼카 토토 쌍은 서로의 부정자로 유효하게 표시될 수 있습니다. 이는 (A x)가 모든 x에 대해 (B x)와 같지 않음을 의미합니다.

범퍼카 토토의 부정자는 정의할 범퍼카 토토와 동일한 왼쪽 및/또는 오른쪽 피범퍼카 토토 유형을 가져야 합니다. 따라서 with와 마찬가지로커뮤테이터, 범퍼카 토토 이름만에 제공하면 됩니다.NEGATOR절.

부정자를 제공하는 것은 다음과 같은 표현식을 허용하므로 쿼리 최적화 프로그램에 매우 유용합니다.NOT (x = y)간소화하다x < y. 이 문제는 생각보다 자주 발생합니다. 왜냐하면아님작업은 다른 재배열의 결과로 삽입될 수 있습니다.

36.15.3. 제한 #

제한절이 제공되면 연산자에 대한 제한 선택성 추정 함수의 이름을 지정합니다. (이것은 연산자 이름이 아닌 함수 이름입니다.)제한절은 다음을 반환하는 이항 범퍼카 토토에만 의미가 있습니다.부울. 제한 선택성 추정기의 기본 아이디어는 테이블의 행 중 몇 부분이 다음을 만족하는지 추측하는 것입니다.어디-양식의 절 조건:

열 OP 상수

현재 연산자 및 특정 상수 값에 대해. 이는 다음을 통해 제거될 행 수에 대한 아이디어를 제공함으로써 최적화 프로그램을 지원합니다.어디이 형식을 갖는 절입니다. (상수가 왼쪽에 있으면 어떻게 됩니까? 궁금하실 수도 있습니다. 음, 그게 바로 그 중 하나입니다.커뮤테이터다음을 위한 것입니다...)

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

eqselfor=
네크셀for<
scalarltselfor<
scalarleselfor<=
scalargtselfor
scallargeselfor=

둘 중 하나를 사용하면 자주 벗어날 수 있습니다.eqsel또는네크셀실제로는 동등하거나 불평등하지 않더라도 선택성이 매우 높거나 매우 낮은 연산자용입니다. 예를 들어, 대략 동일 기하 연산자는 다음을 사용합니다.eqsel대개 테이블 항목 중 극히 일부만 일치한다는 가정하에.

당신은 사용할 수 있습니다scalarltsel, scalarlesel, scalargtsel그리고scallargesel범위 비교를 위해 숫자 스칼라로 변환되는 합리적인 수단이 있는 데이터 유형에 대한 비교용. 가능하다면 함수가 이해하는 데이터 유형을 추가하세요.convert_to_scalar()insrc/backend/utils/adt/selfuncs.c. (결국 이 함수는 다음 열을 통해 식별되는 데이터 유형별 함수로 대체되어야 합니다.pg_type시스템 카탈로그; 하지만 아직 그런 일은 일어나지 않았습니다.) 이렇게 하지 않으면 문제는 계속 작동하지만 옵티마이저의 추정치는 기대만큼 좋지 않을 것입니다.

또 다른 유용한 내장 선택성 추정 기능은 다음과 같습니다.matchingsel, 입력 데이터 유형에 대해 표준 MCV 및/또는 히스토그램 통계가 수집되는 경우 거의 모든 이진 연산자에 작동합니다. 기본 추정치는 사용된 기본 추정치의 두 배로 설정됩니다.eqsel, 동등성보다 다소 덜 엄격한 비교 연산자에 가장 적합합니다. (또는 기본을 호출할 수도 있습니다.generic_restriction_selectivity함수, 다른 기본 추정값 제공.)

기하 범퍼카 토토를 위해 설계된 추가 선택성 추정 함수가 있습니다.src/backend/utils/adt/geo_selfuncs.c: areasel, positionsel콘셀. 이 글을 쓰는 시점에서 이것은 단지 토막일 뿐이지만 어쨌든 사용하고 싶을 수도 있습니다(또는 더 좋게는 개선할 수도 있습니다).

36.15.4. 가입 #

가입절이 제공되면 범퍼카 토토에 대한 조인 선택성 추정 함수의 이름을 지정합니다. (이것은 범퍼카 토토 이름이 아닌 함수 이름입니다.)가입절은 다음을 반환하는 이항 범퍼카 토토에만 의미가 있습니다.부울. 조인 선택성 추정기의 기본 아이디어는 테이블 쌍의 행 중 몇 부분이 다음을 만족할지 추측하는 것입니다.어디-형식의 절 조건:

table1.column1 OP table2.column2

현재 운영자에 대한 것입니다. 와 마찬가지로제한절, 이는 가능한 여러 조인 시퀀스 중 어느 것이 가장 적은 작업을 수행할 것인지 파악함으로써 최적화 프로그램에 매우 큰 도움이 됩니다.

이전과 마찬가지로 이 장에서는 조인 선택 추정기 함수를 작성하는 방법을 설명하지 않지만 적용 가능한 경우 표준 추정기 중 하나를 사용하도록 제안합니다.

eqjoinselfor=
neqjoinselfor<
scalarltjoinselfor<
scalarlejoinselfor<=
scalargtjoinselfor
scallargejoinselfor=
matchingjoinsel일반 일치 범퍼카 토토의 경우
areajoinsel2D 영역 기반 비교용
positionjoinsel2D 위치 기반 비교용
contjoinsel2D 포함 기반 비교용

36.15.5. 해시 #

해시절이 있는 경우 이 연산자를 기반으로 한 조인에 해시 조인 방법을 사용할 수 있음을 시스템에 알립니다.해시반환하는 이항 범퍼카 토토에만 의미가 있습니다부울, 실제로 연산자는 일부 데이터 유형 또는 데이터 유형 쌍에 대한 동일성을 나타내야 합니다.

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

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

해시 함수를 준비할 때는 주의를 기울여야 합니다. 왜냐하면 기계에 따라 올바른 작업을 수행하지 못할 수 있는 방식이 있기 때문입니다. 예를 들어, 데이터 유형이 흥미롭지 않은 패드 비트가 있을 수 있는 구조인 경우 전체 구조를 간단히 전달할 수는 없습니다.hash_any. (사용하지 않는 비트가 항상 0이 되도록 다른 연산자와 함수를 작성하지 않는 한 이는 권장되는 전략입니다.) 또 다른 예는 다음을 충족하는 시스템입니다.IEEE부동 소수점 표준, 음의 0과 양의 0은 서로 다른 값(다른 비트 패턴)이지만 같음을 비교하도록 정의되었습니다. float 값에 음수 0이 포함될 수 있는 경우 양수 0과 동일한 해시 값을 생성하도록 추가 단계가 필요합니다.

해시 조인 가능 연산자에는 동일한 연산자 계열에 나타나는 정류자(두 피연산자 데이터 유형이 동일한 경우 자체, 다른 경우 관련된 항등 연산자)가 있어야 합니다. 그렇지 않은 경우 연산자를 사용할 때 플래너 오류가 발생할 수 있습니다. 또한 여러 데이터 유형을 지원하는 해시 연산자 계열이 모든 데이터 유형 조합에 대해 동등 연산자를 제공하는 것이 좋습니다(그러나 엄격히 요구되는 것은 아닙니다). 이를 통해 더 나은 최적화가 가능합니다.

참고

해시 조인 가능 연산자의 기본 함수는 불변 또는 안정으로 표시되어야 합니다. 일시적인 경우 시스템은 해시 조인에 연산자를 사용하려고 시도하지 않습니다.

참고

해시 조인 가능 연산자에 엄격으로 표시된 기본 함수가 있는 경우 함수도 완전해야 합니다. 즉, 두 개의 null이 아닌 입력에 대해 true 또는 false를 반환해야 하며 절대로 null을 반환해야 합니다. 이 규칙을 따르지 않으면 해시 최적화IN작업으로 인해 잘못된 결과가 발생할 수 있습니다. (구체적으로는,IN표준에 따른 정답이 null인 경우 false를 반환할 수 있습니다. 또는 null 결과에 대비하지 않았다는 오류가 발생할 수 있습니다.)

36.15.6. 병합 #

병합절이 있는 경우 이 연산자를 기반으로 하는 조인에 병합-조인 방법을 사용할 수 있음을 시스템에 알립니다.병합반환하는 이항 범퍼카 토토에만 의미가 있습니다부울, 실제로 연산자는 일부 데이터 유형 또는 데이터 유형 쌍에 대한 동일성을 나타내야 합니다.

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

표시 예정병합, 조인 범퍼카 토토는 a의 등호 멤버로 나타나야 합니다.브트리색인 연산자 계열. 물론 참조 연산자 계열이 아직 존재할 수 없기 때문에 연산자를 만들 때 이는 적용되지 않습니다. 그러나 일치하는 연산자 계열을 찾을 수 없으면 연산자는 실제로 병합 조인에 사용되지 않습니다.병합플래그는 일치하는 범퍼카 토토 계열을 찾을 가치가 있다는 힌트 역할을 플래너에게 제공합니다.

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

참고

병합 조인 가능 연산자의 기본 함수는 불변 또는 안정으로 표시되어야 합니다. 일시적인 경우 시스템은 병합 조인에 연산자를 사용하려고 시도하지 않습니다.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.