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

35.13. 운영자 최적화 정보

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

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

35.13.1. 커뮤테이터

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

교환 가능한 젠 토토의 왼쪽 피젠 토토 유형이 동일합니다. 정류자의 올바른 피젠 토토 유형으로, 그 반대의 경우도 마찬가지입니다. 그래서 정류자 젠 토토의 이름이 전부입니다.PostgreSQL조회하려면 제공되어야 합니다. 정류자가 제공되어야 하는 전부입니다.커뮤테이터절.

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

자기교환 젠 토토를 정의할 때, 그것을 해라. 교환 젠 토토 쌍을 정의할 때, 상황은 조금 더 까다롭습니다. 첫 번째 사람이 어떻게 될 수 있습니까? 정의된 것은 아직 정의하지 않은 다른 것을 참조합니까? 이 문제에는 두 가지 해결책이 있습니다.

  • 한 가지 방법은 다음을 생략하는 것입니다.커뮤테이터첫 번째 연산자의 절 정의한 다음 두 번째 연산자에 하나를 제공합니다. 정의. 부터PostgreSQL교환 가능하다는 것을 알고 있습니다 젠 토토는 두 번째 정의를 볼 때 쌍으로 옵니다. 자동으로 돌아가서 누락된 부분을 채웁니다.커뮤테이터첫 번째 절 정의.

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

35.13.2. NEGATOR

NEGATOR절(제공된 경우) 연산자의 부정인 연산자의 이름을 지정합니다. 한정된. 다음과 같은 경우 연산자 A는 연산자 B의 부정자라고 말합니다. 둘 다 부울 결과를 반환하고 (x A y)는 NOT (x B y)와 같습니다. 가능한 모든 입력 x, y. B는 또한 다음의 부정자임을 주목하세요. A. 예를 들어,<그리고=는 대부분의 데이터 유형에 대한 부정자 쌍입니다. 안 젠 토토는 자신의 부정자가 될 수 없습니다.

정류자와 달리 단항 젠 토토 쌍은 유효하게 사용할 수 있습니다. 서로의 부정자로 표시됩니다. 그것은 (A x)를 의미합니다 모든 x에 대해 NOT (B x) 또는 오른쪽 단항에 해당하는 것과 같습니다. 젠 토토.

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

부정자를 제공하는 것은 쿼리 최적화 프로그램에 매우 도움이 됩니다 다음과 같은 표현을 허용하기 때문에아님 (x = 와이)간단히 설명하자면x < 와이. 이 문제는 생각보다 자주 발생합니다. 왜냐하면아님작업은 다음과 같이 삽입될 수 있습니다. 다른 재배치의 결과.

부정 젠 토토 쌍은 동일한 젠 토토를 사용하여 정의할 수 있습니다. 위에서 정류자 쌍에 대해 설명한 방법입니다.

35.13.3. 제한

제한절(제공된 경우) 에 대한 제한 선택성 추정 함수의 이름을 지정합니다. 연산자. (이것은 연산자가 아닌 함수 이름입니다. 이름.)제한절은 단지 반환하는 이항 젠 토토에 대한 의미부울. 제한 선택성의 이면에 있는 아이디어 추정기는 테이블의 행 중 몇 부분이 나올지 추측하는 것입니다. a를 만족시키다어디-절 조건 형식:

열 OP 상수

현재 연산자 및 특정 상수 값에 대해. 이는 최적화 프로그램이 얼마나 많은지에 대한 아이디어를 제공함으로써 도움을 줍니다. 행은 다음에 의해 제거됩니다.어디이 형식을 갖는 절입니다. (상수가 다음과 같으면 어떻게 될까요? 왼쪽에, 궁금하시죠? 글쎄, 그게 그 중 하나야 그런 것들커뮤테이터다음을 위한 것입니다...)

새로운 제한 선택성 추정 함수를 작성하는 것은 이 장의 범위를 훨씬 벗어나지만 다행히도 일반적으로 시스템의 표준 추정기 중 하나를 사용합니다. 당신의 많은 운영자. 이는 표준 제한사항입니다. 추정자:

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

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

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

추가 선택성 추정 기능이 있습니다 기하 젠 토토를 위해 설계됨src/backend/utils/adt/geo_selfuncs.c: areasel, positionsel콘셀. 이 글을 쓰는 시점에서 이것들은 단지 스텁이지만 이를 사용하고 싶을 수도 있습니다(또는 더 나은 방법으로 개선). 그들) 어쨌든.

35.13.4. 가입

가입절, 제공된 경우 이름 젠 토토에 대한 조인 선택성 추정 함수. (메모 이는 젠 토토 이름이 아닌 함수 이름입니다.)가입절은 바이너리에만 의미가 있습니다. 반환하는 젠 토토부울. 아이디어 조인 선택성 추정기 뒤에 있는 것은 몇 분의 1인지 추측하는 것입니다. 한 쌍의 테이블에 있는 행 중 다음을 만족합니다.어디에서-양식의 절 조건:

table1.column1 OP table2.column2

현재 운영자에 대한 것입니다. 와 마찬가지로제한절, 이는 최적화 프로그램에 매우 도움이 됩니다. 실질적으로 여러 가지 중 어느 것이 무엇인지 파악하게 함으로써 가능한 조인 시퀀스는 최소한의 작업이 소요될 가능성이 높습니다.

이전과 마찬가지로 이 장에서는 방법을 설명하지 않을 것입니다. 조인 선택성 추정 함수를 작성하려면 다음과 같은 경우 표준 추정기 중 하나를 사용하는 것이 좋습니다. 해당되는:

eqjoinselfor=
neqjoinselfor<
scalarltjoinselfor<또는<=
scalargtjoinselfor또는=
areajoinsel24499_24541
positionjoinsel24632_24678
contjoinsel24765_24814

35.13.5. 해시

해시절(있는 경우) 해시 조인을 사용하는 것이 허용된다는 것을 시스템에 알려줍니다. 이 연산자를 기반으로 한 조인 방법입니다.해시이진 젠 토토에만 적합합니다. 그 반환부울및 실제로 젠 토토는 일부 데이터 유형이나 쌍에 대해 동일성을 나타내야 합니다. 데이터 유형입니다.

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

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

해시 함수를 준비할 때는 주의를 기울여야 합니다. 기계에 따라 실패할 수 있는 방식이 있기 때문입니다. 옳은 일을 하기 위해. 예를 들어, 데이터 유형이 흥미롭지 않은 패드 비트가 있을 수 있는 구조, 단순히 전체 구조를 전달할 수는 없습니다.hash_any. (다른 글을 쓰지 않는 한 사용되지 않은 비트가 있는지 확인하는 연산자 및 함수 항상 0입니다. 이는 권장되는 전략입니다.) 또 다른 예를 들어 다음을 충족하는 시스템의 경우입니다.IEEE부동 소수점 표준, 음수 0 양의 0은 다른 값입니다(다른 비트 패턴). 그러나 그들은 동등하다고 비교하도록 정의됩니다. 부동 소수점 값이 음수 0이 포함된 경우 이를 보장하기 위해 추가 단계가 필요합니다. 양수 0과 동일한 해시 값을 생성합니다.

해시 조인 가능 연산자에는 정류자가 있어야 합니다. 두 피연산자 데이터 유형이 동일하거나 관련된 동등성 연산자가 다른 경우) 동일하게 나타나는 경우 운영자 가족. 그렇지 않으면 플래너 오류가 발생할 수 있습니다. 연산자를 사용할 때 발생합니다. 또한 좋은 생각입니다(그러나 엄격하게 요구되지는 않음)을 지원하는 해시 연산자 제품군의 경우 여러 데이터 유형에 대해 항등 연산자를 제공합니다. 데이터 유형의 조합; 이것은 더 나은 것을 허용합니다 최적화.

참고:해시 조인 가능 기반 함수 연산자는 불변 또는 안정으로 표시되어야 합니다. 그렇다면 휘발성이므로 시스템은 절대 연산자를 사용하려고 시도하지 않습니다. 해시 조인의 경우.

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

35.13.6. 병합

병합절이 있는 경우, 병합 조인을 사용하는 것이 허용됨을 시스템에 알립니다. 이 연산자를 기반으로 하는 조인 방법입니다.병합이진 젠 토토에만 의미가 있습니다. 그 반환부울, 실제로는 젠 토토는 일부 데이터 유형이나 쌍에 대해 동일성을 나타내야 합니다. 데이터 유형입니다.

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

표시 예정병합, 조인 젠 토토는 a의 동등 멤버로 나타나야 합니다.브트리색인 연산자 계열. 이것은 아니다 연산자를 생성할 때 적용됩니다. 참조 연산자 계열이 아직 존재할 수 없습니다. 그러나 연산자는 실제로 병합 조인에 사용되지 않습니다. 일치하는 연산자 제품군을 찾을 수 있습니다. 그만큼병합플래그는 계획자에게 힌트 역할을 합니다. 일치하는 젠 토토 계열을 찾아볼 가치가 있습니다.

병합 조인이 가능한 연산자에는 정류자가 있어야 합니다. 두 피연산자 데이터 유형이 동일하거나 관련된 동등성 연산자가 다른 경우) 동일하게 나타나는 경우 운영자 가족. 그렇지 않으면 플래너 오류가 발생할 수 있습니다. 연산자를 사용할 때 발생합니다. 또한 좋은 생각입니다(그러나 엄격하게 요구되지는 않음)브트리여러 데이터 유형을 지원하는 연산자 계열 모든 데이터 유형 조합에 대한 항등 연산자; 이를 통해 더 나은 최적화가 가능합니다.

참고:병합 조인 가능의 기본 기능 연산자는 불변 또는 안정으로 표시되어야 합니다. 그렇다면 휘발성이므로 시스템은 절대 연산자를 사용하려고 시도하지 않습니다. 병합 조인의 경우.