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

14.3. 토토 사이트 순위 최적화 정보

저자 :Tom Lane에 의해 작성되었습니다.

aPostgreSQL토토 사이트 순위 정의에는 몇 가지 선택적인 조항이 포함될 수 있습니다 시스템은 토토 사이트 순위의 행동 방식에 대한 유용한 것들. 이것들 조항은 가능할 때마다 제공되어야합니다 사용하는 쿼리 실행에 상당한 속도를 높이십시오. 연산자. 그러나 당신이 그들에게 제공한다면, 당신은 옳다! 최적화 조항을 잘못 사용하면 발생할 수 있습니다 백엔드 충돌, 미묘하게 잘못된 출력 또는 기타 나쁜 것들. 너 확실하지 않은 경우 항상 최적화 조항을 남길 수 있습니다. 그것에 대해; 유일한 결과는 쿼리가 느리게 실행될 수 있다는 것입니다 필요한 것보다.

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

14.3.1. 정류기

theCommutator조항, 제공되는 경우, 토토 사이트 순위의 통근자 인 토토 사이트 순위의 이름 한정된. 우리는 토토 사이트 순위 A가 토토 사이트 순위 B의 통근자라고 말합니다. 경우 (x a y)가 가능한 모든 입력 값 x, y에 대해 (y b x)와 동일합니다. B는 또한 A의 정류자입니다. 예를 들어, 연산자<and특정 데이터 유형의 경우 일반적으로 각각입니다 기타의 정류자 및 토토 사이트 순위+is 일반적으로 그 자체로 정류. 그러나 토토 사이트 순위-보통 아무것도 통근하지 않습니다.

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

자체 관리 연산자를 정의 할 때, 당신은 그냥 그것을하십시오. 한 쌍의 정류 연산자를 정의 할 때 상황은 조금 까다 롭습니다. 첫 번째는 어떻게 될 수 있습니까? 정의 된 다른 것을 참조하십시오. 아직 정의하지 않은 다른 것을 참조하십시오. 이 문제에 대한 두 가지 해결책이 있습니다.

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

  • 더 간단한 방법은 단지 포함하는 것입니다Commutator둘 다의 조항 정의. 언제postgresql첫 번째를 처리합니다 정의하고 그것을 깨닫고Commutator존재하지 않는 것을 나타냅니다 연산자, 시스템은 더미에 더 많은 항목을 만들 것입니다. 시스템 카탈로그의 연산자. 이 더미 출품작은 가질 것입니다 토토 사이트 순위 이름, 왼쪽 및 오른쪽에 대해서만 유효한 데이터 피연산자 유형 및 결과 유형은 전부이기 때문에PostgreSQL추론 할 수 있습니다 이 점. 첫 번째 토토 사이트 순위의 카탈로그 항목이 링크됩니다 이 더미 항목. 나중에 두 번째를 정의 할 때 연산자, 시스템은 더미 항목을 업데이트합니다 두 번째 정의의 추가 정보. 당신이 더미 연산자가 채워지기 전에 사용하십시오. 오류 메시지가 표시됩니다. (참고 :이 절차는 그랬습니다 안정적으로 작동하지 않음PostgreSQL6.5 이전 버전 이제 일을하는 것이 권장되는 방법입니다.)

14.3.2. 부정관

the부정관조항, 제공되는 경우, 운영자의 부정인 인 연산자의 이름 한정된. 우리는 운영자 A가 연산자 B의 부정 자라고 말합니다. 둘 다 부울 결과를 반환하고 (x a y)는 (x b y)와 동일합니다. 가능한 모든 입력 x, y. B는 또한 부정 자입니다 A. 예를 들어<and =는 대부분의 데이터 유형에 대한 부정 쌍입니다. an 토토 사이트 순위는 결코 자신의 부정자가 될 수 없습니다.

정류자와 달리 한 쌍의 단백조 연산자가 유효하게 할 수 있습니다 서로의 부정 자로 표시됩니다. 그것은 (a x)를 의미합니다 모든 X의 경우 (B X)가 아니거나 오른쪽 단지에 해당합니다. 연산자.

토토 사이트 순위의 부정자는 동일한 왼쪽 및/또는 오른쪽을 가져야합니다. 오페라는 토토 사이트 순위 자체로 유형이므로와 마찬가지로Commutator, 연산자 이름 만 에 필요합니다부정관조항

부정기 제공은 쿼리 최적화에 매우 도움이됩니다. (x = y)와 같은 표현이 단순화 될 수 있으므로 x < y로. 이것은 당신보다 더 자주 나타납니다 다른 사람의 결과로 삽입 할 수 없기 때문에 생각하십시오. 재 배열.

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

14.3.3. 얽매다

the제한조항, 제공되는 경우, 제한 선택성 추정 함수의 이름을 지정합니다 연산자 (이것은 연산자가 아닌 함수 이름입니다. 이름).제한조항은 만듭니다 반환되는 이진 연산자에 대한 감각부울. 제한 선택성의 아이디어 추정기는 테이블의 행의 일부가 만족여기서-Clase 조건 양식

컬럼 OP Constant

현재 연산자 및 특정 상수 값의 경우. 이것은 얼마나 많은지에 대한 아이디어를 제공함으로써 Optimizer를 지원합니다. 행은에 의해 제거됩니다.여기서이 양식을 가진 조항. (상수가 발생하면 어떻게됩니까? 왼쪽에 궁금할까요? 글쎄, 그것은 하나입니다 그 것들Commutator

새로운 제한 선택성 추정 기능 쓰기는 다음과 같습니다 이 장의 범위를 훨씬 뛰어 넘지 만 다행히도 일반적으로 시스템의 표준 추정기 중 하나를 사용하십시오. 많은 자신의 운영자. 이것들은 표준 제한입니다 추정기 :

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

당신은 자주 두 가지를 사용하여 도망 갈 수 있습니다eqsel또는Neqsel선택성이 매우 높거나 매우 낮은 토토 사이트 순위, 심지어 그들이 실제로 평등이나 불평등이 아니라면. 예를 들어, 대략 평등 기하학적 토토 사이트 순위 사용eqsel일반적으로 그들이 할 것이라고 가정합니다 테이블의 항목의 작은 부분 만 일치합니다.

사용할 수 있습니다ScalarltselandScalargtsel비교 현명한 변환 수단이있는 데이터 유형 범위 비교를위한 숫자 스칼라로. 가능하면 추가하십시오 일상에 의해 이해되는 데이터 유형convert_to_scalar ()insrc/backend/utils/adt/selfuncs.c. (결국, 이 루틴은 데이터 당 유형 기능으로 대체되어야합니다 열을 통해 식별pg_type시스템 카탈로그; 그러나 그것은 그렇지 않았습니다 아직 일어났다.)이 작업을 수행하지 않으면 여전히 일이 작동합니다. 그러나 Optimizer의 추정치는 가능한 한 좋지 않을 것입니다. BE.

추가 선택성 함수가 설계되었습니다 기하학적 연산자src/backend/utils/adt/geo_selfuncs.c: Areael, PositiesselContsel. 이 글에서 이것은 단지입니다 스터브, 그러나 당신은 그것들을 사용하고 싶을 수도 있습니다 (또는 더 나은 개선 그들) 어쨌든.

14.3.4. 가입하다

theJoin조항, 제공된 경우 이름 연산자의 조인 선택성 추정 함수 (참고 이것은 연산자 이름이 아닌 함수 이름이라는 것입니다).Join조항은 이진에 대해서만 적합합니다 반환하는 운영자부울. 아이디어 결합 선택성 추정기 뒤에는 어떤 분수가 있는지 추측하는 것입니다. 한 쌍의 테이블에있는 행의 줄은 A를 만족시킬 것입니다여기서-양식의 클래스 조건

표 1.column1 op table2.column2

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

이전과 같이,이 장은 방법을 설명하려고 시도하지 않을 것입니다. 결합 선택성 추정기 기능을 작성하려면 표준 추정기 중 하나를 사용하는 경우 해당되는:

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

14.3.5. 해시

the해시절, 참석하는 경우, 해시 조인 메소드를 사용해도 괜찮다고 시스템에 알려줍니다. 이 연산자를 기반으로 한 가입.해시반환하는 이진 연산자에게만 적합부울, 그리고 실제로 토토 사이트 순위는 더 나아졌습니다 일부 데이터 유형에 대한 평등이 되십시오.

해시 조인의 기본 가정은 조인입니다 운영자는 왼쪽과 오른쪽 쌍에 대해서만 진실을 반환 할 수 있습니다. 동일한 해시 코드에 해시 값. 두 값을 넣으면 다른 해시 버킷에서 조인은 절대 비교하지 않습니다. 모두가 조인 연산자의 결과가 암시 적으로 거짓이어야합니다. 따라서 지정하는 것은 의미가 없습니다해시대표하지 않는 연산자의 경우 평등.

실제로 논리적 평등도 충분하지 않습니다. 그만큼 운영자는 순수한 비트 동등성을 더 잘 표현했습니다 해시 함수는 메모리 표현에서 계산됩니다. 비트의 의미에 관계없이 값의. 예를 들어, 시간 간격의 평등은 비교적 평등이 아닙니다. 그만큼 간격 평등 연산자는 두 시간 간격을 동일하게 간주합니다 동일한 기간이있는 경우 엔드 포인트 여부에 관계없이 동일합니다. 이것이 의미하는 바는 사용에 가입하는 것입니다.=간격 필드 사이의 결과는 다릅니다 구현 된 경우보다 해시 조인으로 구현 된 경우 결과 다른 방법으로, 쌍의 큰 부분이 일치하는 것은 다른 값으로 해시되며 결코 비교되지 않습니다. 해시 조인에 의해. 그러나 최적화가 다른 것을 사용하기로 선택한 경우 평등 연산자가 말하는 모든 쌍은 동일하게 찾을 수 있습니다. 우리는 그런 종류의 불일치를 원하지 않습니다. 그래서 우리는 간격 평등을 해시 가능으로 표시하지 않습니다.

해시가 결합하는 기계 의존적 방법도 있습니다. 옳은 일을하지 못할 수도 있습니다. 예를 들어, 데이터 인 경우 유형은 무관심 패드가있을 수있는 구조입니다. 비트, 평등 연산자를 표시하는 것은 안전하지 않습니다해시. (아마도 당신은 다른 사람을 쓰지 않는 한 사용하지 않은 비트가 항상 0임을 보장하는 연산자.) 또 다른 예는 부동 소수점 데이터 유형이라는 것입니다 해시 조인에 대한 안전하지 않습니다. 를 충족하는 기계에서IEEE플로팅 포인트 표준, 마이너스 0 및 + 0은 다른 값입니다 (다른 비트 패턴) 그러나 동일하게 비교하도록 정의됩니다. 따라서 부동 소수점 데이터 유형의 평등 연산자가 두드러진해시, 마이너스 0 및 플러스 0은 아마도 해시 조인에 의해 일치하지 않을 것이지만 다른 조인 프로세스와 일치합니다.

결론은 아마도 당신이 아마만 사용해야한다는 것입니다해시평등 연산자의 경우 (또는 가능) 구현memcmp ().

14.3.6. Sort1 및 Sort2

theSort성 조, 참석하면 말하십시오 Merge 조인 메소드를 사용하는 것이 허용되는 시스템 현재 연산자를 기준으로 조인. 둘 다 있어야합니다 어느 쪽이든 지정됩니다. 현재 운영자는 평등이어야합니다 일부 데이터 유형 쌍의 경우Sort1andSort2조항 주문 연산자의 이름을 지정하십시오 ("<"27290_27363

병합 조인 오른쪽 테이블을 순서대로 한 다음 병렬로 스캔합니다. 따라서 두 데이터 유형 모두 완전히 주문할 수 있어야하며 조인 연산자는 쌍에 대해서만 성공할 수있는 연산자 여야합니다. 에 떨어지는 가치"동일 장소"정렬 순서로. 실제로 이것은 그것을 의미합니다 조인 연산자는 평등처럼 행동해야합니다. 그러나 해시와는 달리 왼쪽 및 오른쪽 데이터 유형이 더 나은 곳에 가입 동일 (또는 적어도 비트 동등한), 가능합니다. 두 개의 별개의 데이터 유형을 병합하는 한 논리적으로 호환됩니다. 예를 들어,int2-ersus-int4평등 연산자는 합병 가능합니다. 우리는 정렬 연산자 만 있으면됩니다 두 데이터 유형 모두 논리적으로 호환됩니다 순서.

Merge-Sort 연산자를 지정할 때 현재 연산자 그리고 두 참조 된 운영자 모두 반환해야합니다부울; 그만큼Sort1운영자는 현재와 동일한 입력 데이터 유형을 모두 가져야합니다. 작업자의 왼쪽 피연산자 유형 및Sort2운영자는 두 입력 데이터 유형이 모두 있어야합니다 현재 운영자의 오른쪽 피연산자 유형과 동일합니다. (Commutatorand부정관, 이것은 토토 사이트 순위 이름이임을 의미합니다 연산자를 지정하기에 충분하고 시스템이 정의 할 경우 더미 토토 사이트 순위 항목을 만듭니다. 다른 사람 앞의 평등 토토 사이트 순위.)

실제로 쓰기 만하면Sort클로즈를위한=토토 사이트 순위 및 두 참조 연산자는 항상 있어야합니다 이름<. Merge Join을 사용하려고합니다 다른 이름으로 운영자가 있으면 희망이 없습니다 혼란, 우리가 잠시 동안 볼 이유가 있습니다.

작업자에게 표시하는 추가 제한 사항이 있습니다 합병 가능한. 이러한 제한은 현재 확인되지 않습니다토토 사이트 순위 생성그러나 합병 가입은 5 월입니다 사실이 아닌 경우 런타임에 실패합니다.

  • 병합 합의 가능한 평등 연산자에게는 a가 있어야합니다 정류자 (두 개의 데이터 유형이 동일하거나 관련 평등 연산자가 다른 경우).

  • <29899_29914주문 연산자가 있습니다 동일한 좌우 및 오른쪽 피연산자 데이터 유형 합병 가능한 연산자 자체. 이 연산자필수지명<; 당신은 선택의 여지가 없습니다 문제를 지정할 조항이 없기 때문에 중요합니다 명시 적으로. 왼쪽 및 오른쪽 데이터 유형이 다르게,이 연산자 중 어느 것도 어느 것도 동일하지 않습니다정렬연산자. 그러나 그들은 더 좋았습니다 데이터 값을 호환 적으로 주문하십시오.Sort운영자 또는 병합 조인이 실패합니다 일하기 위해.