A 포스트그레SQL연산자 정의에는 다음을 알려주는 여러 선택적 절이 포함될 수 있습니다. 운영자의 행동 방식에 대한 시스템 유용한 정보. 이것들 조항은 필요할 때마다 제공되어야 합니다. 다음을 사용하는 쿼리 실행 속도가 상당히 향상됩니다. 운영자. 하지만 제공하는 경우에는 다음 사항을 확인해야 합니다. 맞아요! 최적화 절을 잘못 사용하면 다음과 같은 결과가 발생할 수 있습니다. 서버 프로세스 충돌, 미묘하게 잘못된 출력 또는 기타 나쁜 상황. 그렇지 않은 경우 언제든지 최적화 절을 생략할 수 있습니다. 물론이죠; 유일한 결과는 쿼리가 실행될 수 있다는 것입니다. 필요한 것보다 느립니다.
추후에 추가적인 최적화 조항이 추가될 수 있습니다 버전포스트그레SQL. 그들 여기에 설명된 내용은 7.4.30 릴리스의 모든 내용입니다. 이해합니다.
그커뮤테이터절(제공된 경우) 범퍼카 토토의 정류자인 범퍼카 토토의 이름을 지정합니다. 정의되었습니다. 범퍼카 토토 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이 시점에서 추론할 수 있습니다. 첫 번째 운영자의 카탈로그 항목이 이 더미에 연결됩니다. 입장. 나중에 두 번째 연산자를 정의할 때 시스템은 추가 항목으로 더미 항목을 업데이트합니다. 두 번째 정의의 정보. 사용하려고 하면 채워지기 전에 더미 연산자를 사용하면 됩니다. 오류 메시지가 나타납니다.
그NEGATOR절(제공된 경우) 연산자의 부정인 연산자의 이름을 지정합니다. 정의되었습니다. 다음과 같은 경우 연산자 A는 연산자 B의 부정자라고 말합니다. 둘 다 부울 결과를 반환하고 (x A y)는 NOT (x B y)와 같습니다. 가능한 모든 입력 x, y. B는 또한 다음의 부정자임을 주목하세요. A. 예를 들어,<그리고=은 대부분의 데이터 유형에 대한 부정자 쌍입니다. 안 범퍼카 토토는 자신의 부정자가 될 수 없습니다.
정류자와 달리 단항 범퍼카 토토 쌍은 유효하게 사용할 수 있습니다. 서로의 부정자로 표시됩니다. 그것은 (A x)를 의미합니다 모든 x에 대해 NOT (B x) 또는 오른쪽 단항에 해당하는 것과 같습니다. 범퍼카 토토.
범퍼카 토토의 부정자는 왼쪽 및/또는 오른쪽이 동일해야 합니다 피범퍼카 토토 유형을 정의할 범퍼카 토토로 사용하므로 with와 마찬가지로커뮤테이터, 범퍼카 토토 이름만 에 입력해야 합니다.NEGATOR절.
부정자를 제공하는 것은 쿼리 최적화 프로그램에 매우 도움이 됩니다 다음과 같은 표현을 허용하기 때문에아님 (x = y)간소화하다x < y. 이 문제는 생각보다 자주 발생합니다. 왜냐하면아님작업은 다음과 같이 삽입될 수 있습니다. 다른 재배치의 결과.
부정 범퍼카 토토 쌍은 동일한 범퍼카 토토를 사용하여 정의할 수 있습니다. 위에서 정류자 쌍에 대해 설명한 방법입니다.
그제한절(제공된 경우) 에 대한 제한 선택성 추정 함수의 이름을 지정합니다. 운영자. (이것은 연산자가 아닌 함수 이름입니다. 이름.)제한절은 단지 반환하는 이항 범퍼카 토토에 대한 의미부울. 제한 선택성의 이면에 있는 아이디어 추정기는 테이블의 행 중 몇 부분이 나올지 추측하는 것입니다. a를 만족시키다어디-절 조건 양식
열 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및콘셀. 이 글을 쓰는 시점에서 이것들은 단지
스텁을 사용하고 싶을 수도 있습니다(또는 더 나은 방법으로 개선).
그들) 어쨌든.
그가입절, 제공된 경우 이름 범퍼카 토토에 대한 조인 선택성 추정 함수. (참고 이는 범퍼카 토토 이름이 아닌 함수 이름입니다.)가입절은 바이너리에만 의미가 있습니다. 반환하는 범퍼카 토토부울. 아이디어 조인 선택성 추정기 뒤에 있는 것은 몇 분의 1인지 추측하는 것입니다. 한 쌍의 테이블에 있는 행 중 다음을 만족합니다.어디에서-양식의 절 조건
table1.column1 OP table2.column2
현재 운영자에 대한 것입니다. 와 마찬가지로제한절, 이는 최적화 프로그램에 매우 도움이 됩니다. 실질적으로 여러 가지 중 어느 것이 무엇인지 파악하게 함으로써 가능한 조인 시퀀스는 최소한의 작업이 소요될 가능성이 높습니다.
이전과 마찬가지로 이 장에서는 방법을 설명하지 않을 것입니다. 조인 선택성 추정 함수를 작성하려면 다음과 같은 경우 표준 추정기 중 하나를 사용하는 것이 좋습니다. 해당:
eqjoinsel용= |
neqjoinselfor< |
scalarltjoinselfor<또는<= |
scalargtjoinselfor또는= |
areajoinsel24491_24533 |
positionjoinsel24624_24670 |
contjoinsel24757_24806 |
그해시절이 있는 경우, 해시 조인을 사용하는 것이 허용된다는 것을 시스템에 알려줍니다. 이 연산자를 기반으로 하는 조인 방법입니다.해시이항 범퍼카 토토에만 의미가 있습니다. 그 반환부울, 실제로는 범퍼카 토토는 일부 데이터 유형에 대해 동등해야 합니다.
해시 조인의 기본 가정은 조인이 연산자는 왼쪽과 오른쪽 쌍에 대해서만 true를 반환할 수 있습니다. 동일한 해시 코드로 해시되는 값입니다. 두 값을 넣으면 다른 해시 버킷에서 조인은 절대 비교하지 않습니다. 모두, 조인 연산자의 결과를 암시적으로 가정합니다. 거짓이어야 합니다. 따라서 지정하는 것은 결코 의미가 없습니다.해시표현하지 않는 범퍼카 토토의 경우 평등.
표시 예정해시, 조인 연산자는 해시 인덱스 연산자 클래스에 나타나야 합니다. 이것은 연산자를 생성할 때 시행되지 않습니다. 참조 연산자 클래스가 아직 존재할 수 없습니다. 그러나 시도 해시 조인에서 연산자를 사용하면 런타임에 실패합니다. 연산자 클래스가 존재합니다. 시스템에는 연산자 클래스가 필요합니다. 연산자에 대한 데이터 유형별 해시 함수를 찾습니다. 입력 데이터 유형. 물론 적절한 정보도 제공해야 합니다. 연산자 클래스를 생성하기 전에 해시 함수를 사용하세요.
해시 함수를 준비할 때는 주의를 기울여야 합니다.
기계에 따라 실패할 수 있는 방식이 있기 때문입니다.
옳은 일을 하기 위해. 예를 들어, 데이터 유형이
흥미롭지 않은 패드 비트가 있을 수 있는 구조,
단순히 전체 구조를 전달할 수는 없습니다.hash_any. (다른 글을 쓰지 않는 한
사용되지 않은 비트가 있는지 확인하는 연산자 및 함수
항상 0입니다. 이는 권장되는 전략입니다.) 또 다른
예를 들어 다음을 충족하는 시스템의 경우입니다.IEEE부동 소수점 표준, 음수 0
양의 0은 다른 값입니다(다른 비트 패턴).
그러나 그들은 동등하다고 비교하도록 정의됩니다. 부동 소수점 값이
음수 0이 포함된 경우 이를 보장하기 위해 추가 단계가 필요합니다.
양의 0과 동일한 해시 값을 생성합니다.
참고:해시 조인 가능 기반 함수 연산자는 불변 또는 안정으로 표시되어야 합니다. 그렇다면 휘발성이므로 시스템은 절대 연산자를 사용하려고 시도하지 않습니다. 해시 조인의 경우.
참고:해시 조인 가능 연산자에 strict로 표시된 기본 함수, 함수 또한 완전해야 합니다. 즉, true를 반환해야 합니다. null이 아닌 두 개의 입력에 대해 false이며 null이 아닙니다. 이 규칙이라면 따르지 않음, 해시 최적화IN작업으로 인해 잘못된 결과가 발생할 수 있습니다. (구체적으로는,IN돌아올 수도 있습니다 false 표준에 따른 정답인 경우 null이 됩니다. 또는 다음과 같은 오류가 발생할 수 있습니다. null 결과에 대비하지 않았습니다.)
그병합절(있는 경우) 병합 조인을 사용하는 것이 허용됨을 시스템에 알립니다. 이 연산자를 기반으로 하는 조인 방법입니다.병합이진 범퍼카 토토에만 적합합니다. 그 반환부울, 실제로는 범퍼카 토토는 일부 데이터 유형이나 쌍에 대해 동일성을 나타내야 합니다. 데이터 유형입니다.
병합 조인은 왼쪽 및 오른쪽 정렬 아이디어를 기반으로 합니다. 오른쪽 테이블을 순서대로 정렬한 다음 스캔합니다. 평행. 따라서 두 데이터 유형 모두 완전히 가능해야 합니다. 순서가 지정되어 있으며 조인 연산자는 다음과 같은 연산자만 사용할 수 있어야 합니다. 다음에 해당하는 값 쌍에 대해 성공합니다."같은 장소"정렬 순서로. 실제로는 이 이는 조인 연산자가 동등하게 동작해야 함을 의미합니다. 하지만 왼쪽 및 오른쪽 데이터 유형이 있었던 해시 조인과 달리 같거나 적어도 비트 단위로 동등한 것이 더 좋습니다. 두 개의 서로 다른 데이터 유형을 병합 조인하는 것이 가능합니다. 논리적으로 호환됩니다. 예를 들어,작은int-대-정수항등 연산자는 병합 조인이 가능합니다. 정렬만 하면 됩니다 두 데이터 유형을 모두 논리적으로 가져오는 연산자 호환되는 순서입니다.
병합 조인을 실행하려면 시스템이 다음을 수행할 수 있어야 합니다. 병합-조인 동등성과 관련된 4개의 연산자를 식별합니다. 연산자: 왼쪽 피연산자 데이터 유형에 대한 작음 비교, 올바른 피연산자 데이터 유형에 대한 비교, 미만 두 데이터 유형 간의 비교 및 보다 큼 두 데이터 유형 간의 비교. (실제로는 4개입니다. 병합 조인 가능 연산자가 두 개인 경우 고유 연산자 다른 피연산자 데이터 유형; 하지만 피연산자 유형이 다음과 같은 경우 세 개의 작음 연산자는 모두 동일합니다. 연산자.) 다음 연산자를 지정할 수 있습니다. 개별적으로 이름으로, 다음과 같이정렬1, SORT2, LTCMP, 그리고GTCMP각 옵션. 는 시스템이 기본 이름을 채울 것입니다.<, <, <, 각각 이들 중 하나라도 생략된 경우병합지정되었습니다. 또한,병합다음 중 하나라도 포함된 것으로 가정됩니다. 이 네 가지 연산자 옵션이 나타나므로 다음 작업이 가능합니다. 그 중 일부만 지정하고 시스템이 입력하도록 하세요. 쉬세요.
네 가지 비교 연산자의 피연산자 데이터 유형은 다음과 같습니다. 병합 조인 가능 항목의 피연산자 유형에서 추론됩니다. 연산자와 마찬가지로커뮤테이터, 이 절에는 범퍼카 토토 이름만 제공하면 됩니다. 않는 한 당신은 독특한 범퍼카 토토 이름을 사용하고 있습니다. 쓰기에 충분합니다병합그리고 시스템이 세부사항을 입력합니다. (와 마찬가지로커뮤테이터그리고NEGATOR, 이런 일이 발생하면 시스템은 더미 범퍼카 토토 항목을 만들 수 있습니다. 다른 연산자보다 먼저 항등 연산자를 정의합니다.)
귀하가 표시한 연산자에는 추가 제한사항이 있습니다. 병합 조인 가능. 이러한 제한 사항은 현재 확인되지 않습니다.범퍼카 토토 생성, 하지만 오류가 발생할 수 있습니다. 범퍼카 토토가 사용될 때 true가 아닌 경우:
병합 조인이 가능한 동등 연산자에는 다음이 있어야 합니다. 병합 조인 가능 정류자(두 개의 피연산자 데이터가 유형이 동일하거나 관련된 항등 연산자 다릅니다).
둘 중 하나와 관련된 병합 조인 가능한 연산자가 있는 경우 데이터 유형 A와 B, 또 다른 병합 조인 가능 연산자 B를 세 번째 데이터 유형 C와 연관시키면 A와 C도 다음과 같아야 합니다. 병합 조인 가능한 연산자가 있습니다. 즉, 병합 조인 가능 연산자는 전이적이어야 합니다.
네 가지 경우 런타임에 기괴한 결과가 발생할 것입니다 사용자가 명명한 비교 범퍼카 토토는 데이터 값을 정렬하지 않습니다. 호환 가능합니다.
참고:병합 조인 가능의 기본 기능 연산자는 불변 또는 안정으로 표시되어야 합니다. 그렇다면 휘발성이므로 시스템은 절대 연산자를 사용하려고 시도하지 않습니다. 병합 조인의 경우.
참고:에포스트그레SQL7.3 이전 버전,병합속기는 그렇지 않았습니다. available: 병합 조인이 가능한 연산자를 만들려면 둘 다 쓰세요정렬1그리고SORT2명시적으로. 또한,LTCMP그리고GTCMP옵션이 존재하지 않았습니다. 그 운영자의 이름은 다음과 같습니다 다음과 같이 하드와이어됨<그리고각각.