저자:톰 레인 작성.
A PostgreSQL연산자 정의에는 다음을 알려주는 여러 선택적 절이 포함될 수 있습니다. 운영자의 행동 방식에 대한 시스템 유용한 정보. 이것들 조항은 필요할 때마다 제공되어야 합니다. 다음을 사용하는 쿼리 실행 속도가 상당히 향상됩니다. 운영자. 하지만 제공하는 경우에는 다음 사항을 확인해야 합니다. 맞아요! 최적화 절을 잘못 사용하면 다음과 같은 결과가 발생할 수 있습니다. 백엔드 충돌, 미묘하게 잘못된 출력 또는 기타 나쁜 것들. 당신 확실하지 않은 경우 언제든지 최적화 조항을 생략할 수 있습니다. 그것에 대해; 유일한 결과는 쿼리 실행 속도가 느려질 수 있다는 것입니다. 필요 이상으로요.
추후에 추가적인 최적화 조항이 추가될 수 있습니다 버전포스트그레SQL. 그들 여기에 설명된 내용은 7.2.8 릴리스의 모든 내용입니다. 이해합니다.
그커뮤테이터절(제공된 경우) 토토 사이트 순위의 정류자인 토토 사이트 순위의 이름을 지정합니다. 정의되었습니다. 토토 사이트 순위 A는 토토 사이트 순위 B의 정류자라고 합니다. 가능한 모든 입력 값 x, y에 대해 (x A y)가 (y B x)와 같은 경우. B는 A의 정류자이기도 합니다. 예를 들어, 토토 사이트 순위<그리고특정 데이터 유형의 경우 일반적으로 각각 다른 사람의 정류자 및 토토 사이트 순위+이다 일반적으로 그 자체로 교환 가능합니다. 하지만 토토 사이트 순위-일반적으로 어떤 것과도 교환 가능하지 않습니다.
전환된 연산자의 왼쪽 피연산자 유형은 다음과 같습니다. 정류자의 올바른 피연산자 유형, 그 반대의 경우. 그래서 정류자 연산자의 이름이 전부입니다.PostgreSQL조회를 위해 제공되어야 함 정류자가 제공되어야 하는 전부입니다.커뮤테이터절.
자체 교환 토토 사이트 순위를 정의할 때, 그것을 해라. 교환 토토 사이트 순위 쌍을 정의할 때, 상황은 조금 더 까다롭습니다. 첫 번째 사람이 어떻게 될 수 있습니까? 정의된 것은 아직 정의하지 않은 다른 것을 참조합니까? 이 문제에는 두 가지 해결책이 있습니다.
한 가지 방법은 다음을 생략하는 것입니다.커뮤테이터첫 번째 연산자의 절 정의한 다음 두 번째 연산자에 하나를 제공합니다. 정의. 이후PostgreSQL교환 가능하다는 것을 알고 있습니다 토토 사이트 순위는 두 번째 정의를 볼 때 쌍으로 옵니다. 자동으로 돌아가서 누락된 부분을 채웁니다.커뮤테이터첫 번째 절 정의.
다른 더 간단한 방법은 다음을 포함하는 것입니다.커뮤테이터둘 다의 절 정의. 언제포스트그레SQL첫 번째 처리 정의하고 그것을 깨닫는다커뮤테이터존재하지 않는 것을 나타냅니다. 토토 사이트 순위, 시스템은 이에 대한 더미 항목을 만듭니다. 시스템 카탈로그의 연산자. 이 더미 항목은 왼쪽 및 오른쪽 연산자 이름에 대해서만 유효한 데이터 피연산자 유형 및 결과 유형이 전부입니다.PostgreSQL다음에서 추론할 수 있습니다. 이 점. 첫 번째 운영자의 카탈로그 항목은 다음으로 연결됩니다. 이 더미 항목. 나중에 두 번째를 정의할 때 연산자를 사용하면 시스템은 더미 항목을 다음과 같이 업데이트합니다. 두 번째 정의의 추가 정보. 당신이 채워지기 전에 더미 연산자를 사용해 보세요. 오류 메시지가 나타납니다. (참고: 이 절차는 안정적으로 작동하지 않습니다.PostgreSQL6.5 이전 버전이지만 이제는 작업을 수행하는 데 권장되는 방법입니다.)
그NEGATOR절(제공된 경우) 연산자의 부정인 연산자의 이름을 지정합니다. 정의되었습니다. 다음과 같은 경우 연산자 A는 연산자 B의 부정자라고 말합니다. 둘 다 부울 결과를 반환하고 (x A y)는 NOT (x B y)와 같습니다. 가능한 모든 입력 x, y. B는 또한 다음의 부정자임을 주목하세요. A. 예를 들어,<그리고=은 대부분의 데이터 유형에 대한 부정자 쌍입니다. 안 토토 사이트 순위는 자신의 부정자가 될 수 없습니다.
정류자와 달리 단항 토토 사이트 순위 쌍은 유효하게 사용할 수 있습니다. 서로의 부정자로 표시됩니다. 그것은 (A x)를 의미합니다 모든 x에 대해 NOT (B x) 또는 오른쪽 단항에 해당하는 것과 같습니다. 토토 사이트 순위.
토토 사이트 순위의 부정자는 왼쪽 및/또는 오른쪽이 동일해야 합니다 피토토 사이트 순위 유형은 토토 사이트 순위 자체이므로 with와 같습니다.커뮤테이터, 토토 사이트 순위 이름만 에 입력해야 합니다.NEGATOR절.
부정자를 제공하는 것은 쿼리 최적화 프로그램에 매우 도움이 됩니다 NOT (x = y)와 같은 표현식을 단순화할 수 있기 때문입니다. x < y로. 생각보다 자주 이런 일이 일어납니다. NOT은 다른 결과로 삽입될 수 있기 때문에 생각하십시오. 재배치.
부정 토토 사이트 순위 쌍은 동일한 토토 사이트 순위를 사용하여 정의할 수 있습니다. 위에서 정류자 쌍에 대해 설명한 방법입니다.
그제한절(제공된 경우) 에 대한 제한 선택성 추정 함수의 이름을 지정합니다. 연산자(이것은 연산자가 아닌 함수 이름입니다. 이름).제한절만 작성 반환하는 이항 토토 사이트 순위에 대한 의미부울. 제한 선택성의 이면에 있는 아이디어 추정기는 테이블의 행 중 몇 부분이 나올지 추측하는 것입니다. a를 만족시키다어디에서-절 조건 양식
열 OP 상수
현재 연산자 및 특정 상수 값에 대해. 이는 최적화 프로그램이 얼마나 많은지에 대한 아이디어를 제공함으로써 도움을 줍니다. 행은 다음에 의해 제거됩니다.어디에서이 형식을 갖는 절입니다. (상수가 다음과 같으면 어떻게 될까요? 왼쪽, 궁금하시죠? 글쎄, 그게 그 중 하나야 그런 것들커뮤테이터다음을 위한 것입니다...)
새로운 제한 선택성 추정 함수를 작성하는 것은 이 장의 범위를 훨씬 벗어나지만 다행히도 일반적으로 시스템의 표준 추정기 중 하나를 사용합니다. 당신의 많은 운영자. 이는 표준 제한사항입니다. 추정자:
eqselfor= |
네크셀for< |
scalarltselfor<또는<= |
scalargtselfor또는= |
둘 중 하나를 사용하면 자주 벗어날 수 있습니다.eqsel또는네크셀선택성이 매우 높거나 매우 낮은 토토 사이트 순위의 경우
그것이 실제로 평등도 불평등도 아닌 경우. 예를 들어,
근사 평등 기하학 토토 사이트 순위 사용eqsel그들은 일반적으로
테이블에 있는 항목 중 작은 부분만 일치합니다.
당신은 사용할 수 있습니다scalarltsel그리고scalargtsel비교용
변환할 수 있는 합리적인 수단이 있는 데이터 유형
범위 비교를 위해 숫자 스칼라로 변환합니다. 가능하다면 추가하세요.
루틴이 이해하는 데이터 유형convert_to_scalar()insrc/backend/utils/adt/selfuncs.c. (결국,
이 루틴은 데이터 유형별 함수로 대체되어야 합니다.
의 열을 통해 식별됩니다.pg_type시스템 카탈로그; 하지만 그건 그렇지 않았어
아직 일이 발생하지 않았습니다.) 이렇게 하지 않으면 문제가 계속 발생합니다.
하지만 옵티마이저의 추정치는 가능한 한 좋지 않을 것입니다.
될.
다음을 위해 설계된 추가 선택 기능이 있습니다.
기하 연산자src/backend/utils/adt/geo_selfuncs.c:
areasel, positionsel및콘셀. 이 글을 쓰는 시점에서 이것들은 단지
스텁을 사용하고 싶을 수도 있습니다(또는 더 나은 방법으로 개선).
그들) 어쨌든.
그가입절, 제공된 경우 이름 토토 사이트 순위에 대한 조인 선택성 추정 함수(참고 이는 토토 사이트 순위 이름이 아닌 함수 이름입니다.)가입절은 바이너리에만 의미가 있습니다. 반환하는 토토 사이트 순위부울. 아이디어 조인 선택성 추정기 뒤에 있는 것은 몇 분의 1인지 추측하는 것입니다. 한 쌍의 테이블에 있는 행 중 다음을 만족합니다.어디-양식의 절 조건
table1.column1 OP table2.column2
현재 연산자에 대한 것입니다. 와 마찬가지로제한절, 이는 최적화 프로그램에 매우 도움이 됩니다. 실질적으로 여러 가지 중 어느 것이 무엇인지 파악하게 함으로써 가능한 조인 시퀀스는 최소한의 작업이 소요될 가능성이 높습니다.
이전과 마찬가지로 이 장에서는 방법을 설명하지 않습니다. 조인 선택성 추정 함수를 작성하려면 다음과 같은 경우 표준 추정기 중 하나를 사용하는 것이 좋습니다. 해당:
eqjoinselfor= |
neqjoinsel용< |
scalarltjoinselfor<또는<= |
scalargtjoinselfor또는= |
areajoinsel23252_23294 |
positionjoinsel23385_23431 |
contjoinsel23518_23567 |
그해시절, 존재하는 경우, 해시 조인 방법을 사용해도 괜찮다고 시스템에 알립니다. 이 연산자를 기반으로 한 조인입니다.해시반환하는 이진 토토 사이트 순위에만 의미가 있습니다부울, 실제로 토토 사이트 순위는 더 나은 결과를 얻었습니다. 일부 데이터 유형에서는 동등합니다.
해시 조인의 기본 가정은 조인이 연산자는 왼쪽과 오른쪽 쌍에 대해서만 true를 반환할 수 있습니다. 동일한 해시 코드로 해시되는 값입니다. 두 값을 넣으면 다른 해시 버킷에서 조인은 절대 비교하지 않습니다. 모두, 조인 연산자의 결과를 암시적으로 가정합니다. 거짓이어야 합니다. 따라서 지정하는 것은 결코 의미가 없습니다.해시표현하지 않는 토토 사이트 순위의 경우 평등.
사실 논리적 평등도 충분하지 않습니다. 는 연산자는 순수한 비트 동등성을 더 잘 표현해야 합니다. 왜냐하면 해시 함수는 메모리 표현에서 계산됩니다. 비트의 의미에 관계없이 값의 의미입니다. 예를 들어, 시간 간격의 동일성은 비트별 동일성이 아닙니다. 는 간격 동등 연산자는 두 시간 간격이 동일한 것으로 간주합니다. 끝점 여부에 관계없이 기간이 동일한 경우 동일합니다. 이것이 의미하는 바는 다음을 사용하는 조인입니다.=간격 필드 사이에서 결과가 달라집니다 구현된 경우보다 해시 조인으로 구현된 경우의 결과 다른 방법으로는, 쌍의 상당 부분이 일치 항목은 다른 값으로 해시되며 절대 비교되지 않습니다. 해시 조인으로. 그러나 최적화 프로그램이 다른 방법을 사용하기로 선택한 경우 일종의 조인, 동등 연산자가 말하는 모든 쌍은 다음과 같습니다. 동등하게 발견될 것입니다. 우리는 그런 모순을 원하지 않습니다. 따라서 간격 동일성을 해시 가능으로 표시하지 않습니다.
해시 조인을 수행하는 기계 의존적인 방법도 있습니다 옳은 일을 하지 못할 수도 있습니다. 예를 들어, 귀하의 데이터가 타입은 재미없는 패드가 있을 수 있는 구조입니다 비트, 같음 연산자를 표시하는 것은 안전하지 않습니다.해시. (아마도 당신이 다른 글을 쓰지 않는 한 사용되지 않은 비트가 항상 0이 되도록 보장하는 연산자입니다.) 또 다른 예는 부동 소수점 데이터 유형이 해시 조인에는 안전하지 않습니다. 다음을 충족하는 머신에서IEEE부동 소수점 표준, 마이너스 0과 플러스 0은 다른 값입니다. (다른 비트 패턴) 그러나 동일함을 비교하기 위해 정의됩니다. 따라서 부동 소수점 데이터 유형의 항등 연산자가 다음과 같은 경우 표시됨해시, 마이너스 0과 플러스 0은 아마도 해시 조인과 일치하지 않을 것입니다. 다른 가입 프로세스와 일치하게 됩니다.
결론은 아마도 다음과 같이 사용해야 한다는 것입니다.해시동등 연산자의 경우
(또는 구현될 수 있음)memcmp().
그정렬절, 존재하는 경우 다음을 말함 병합 조인 방식을 사용하는 것이 허용되는 시스템 현재 연산자를 기반으로 한 조인의 경우. 둘 다 있어야합니다 둘 중 하나인 경우 지정됩니다. 현재 연산자는 동일해야 합니다. 일부 데이터 유형 쌍의 경우, 그리고정렬1그리고SORT2절 순서 토토 사이트 순위의 이름을 지정하십시오("<"27337_27410
병합 조인은 왼쪽과 오른쪽 정렬 아이디어를 기반으로 합니다. 오른쪽 테이블을 순서대로 정렬한 다음 병렬로 스캔합니다. 따라서 두 데이터 유형 모두 완전히 정렬될 수 있어야 하며 조인 연산자는 쌍에 대해서만 성공할 수 있는 연산자여야 합니다. 에 해당하는 값"같은 장소"정렬순으로. 실제로 이는 다음을 의미합니다. 조인 연산자는 동등하게 동작해야 합니다. 하지만 해시와 달리 왼쪽 및 오른쪽 데이터 유형이 더 나은 조인 동일(또는 적어도 비트 단위로 동일)하면 다음이 가능합니다. 두 개의 서로 다른 데이터 유형이 병합-조인되는 한 논리적으로 호환됩니다. 예를 들어,int2-대-int4평등 연산자는 병합 조인이 가능합니다. 우리는 정렬 연산자만 필요합니다. 두 데이터 유형을 모두 논리적으로 호환되는 형태로 가져옵니다. 순서.
병합 정렬 연산자를 지정할 때 현재 연산자는 참조된 연산자가 모두 반환되어야 합니다.부울;정렬1연산자는 현재와 동일한 입력 데이터 유형을 모두 가져야 합니다. 연산자의 왼쪽 피연산자 유형 및SORT2연산자는 두 가지 입력 데이터 유형을 모두 가져야 합니다. 현재 연산자의 오른쪽 피연산자 유형과 같습니다. (와 마찬가지로커뮤테이터그리고NEGATOR, 이는 연산자 이름이 운영자를 지정하는 것으로 충분하며 시스템은 다음을 수행할 수 있습니다. 우연히 정의한 경우 더미 연산자 항목을 만듭니다. 다른 연산자보다 먼저 항등 연산자를 사용합니다.)
실제로는 쓰기만 해야 합니다정렬an에 대한 절=토토 사이트 순위이며 참조된 두 토토 사이트 순위는 항상 명명된<. 병합 조인을 사용하려고 합니다. 다른 이름의 토토 사이트 순위를 사용하면 희망이 없습니다. 혼란스러운 이유는 잠시 후에 살펴보겠습니다.
귀하가 표시한 연산자에는 추가 제한사항이 있습니다. 병합 조인 가능. 이러한 제한 사항은 현재 확인되지 않습니다.토토 사이트 순위 생성, 그러나 병합 조인은 true가 아닌 경우 런타임에 실패합니다.
병합-조인 가능 동등 연산자에는 다음이 있어야 합니다. 정류자(두 데이터 유형이 동일한 경우 자체 또는 서로 다른 경우 관련된 항등 연산자).
있어야 합니다<그리고순서 토토 사이트 순위는 왼쪽 및 오른쪽 피토토 사이트 순위 데이터 유형이 동일합니다. 병합 조인 가능 토토 사이트 순위 자체. 이들 토토 사이트 순위반드시이름을 지어주세요<그리고; 너에겐 선택의 여지가 없어 문제는 이를 명시하는 조항이 없기 때문이다. 명시적으로. 왼쪽 및 오른쪽 데이터 유형이 다음과 같은 경우 다릅니다. 이 연산자 중 어느 것도 동일하지 않습니다.정렬연산자. 하지만 그들은 더 좋았어 데이터 값을 다음과 호환되도록 정렬합니다.정렬토토 사이트 순위를 사용하지 않으면 병합 조인이 실패합니다. 일하러.