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

15장. 확장SQL: 윈 토토

포스트그레왼쪽 단항을 지원합니다. 바로 단항 및 이진 연산자입니다. 연산자가 오버로드될 수 있습니다. 즉, 동일한 연산자 이름이 다른 연산자에 사용될 수 있습니다. 다양한 수와 유형의 인수를 갖는 연산자. 만약에 모호한 상황이 있고 시스템이 이를 결정할 수 없습니다. 올바른 연산자를 사용하면 오류가 반환됩니다. 당신은 할 수 있습니다 이를 돕기 위해 왼쪽 및/또는 오른쪽 피연산자를 타입캐스트해야 합니다. 어떤 연산자를 사용하려고 했는지 이해하세요.

모든 윈 토토는 호출에 대한 "구문적 설탕"입니다. 실제 작업을 수행하는 기본 기능; 그러니 당신이 먼저 해야 해요 생성하기 전에 기본 함수를 생성하십시오. 운영자. 그러나 윈 토토는아님추가 정보를 전달하기 때문에 단순한 구문 설탕입니다. 이는 쿼리 플래너가 운영자. 이 장의 대부분은 다음을 설명하는 데 할애됩니다. 추가 정보.

다음은 두 개를 더하는 연산자를 생성하는 예입니다. 복소수. 우리는 이미 정의를 생성했다고 가정합니다. 유형의 콤플렉스. 먼저 작업을 수행하는 함수가 필요합니다. 그런 다음 연산자를 정의할 수 있습니다.

CREATE FUNCTION complex_add(복잡함,복잡함)
    반품 콤플렉스
    AS '$PWD/obj/complex.so'
    언어 'ㄷ';

윈 토토 만들기 + (
    leftarg = 복잡함,
    rightarg = 복잡함,
    프로시저 = complex_add,
    정류자 = +
);

이제 우리는 할 수 있습니다:

SELECT (a + b) AS c FROM test_complex;

+----------------+
|c |
+----------------+
|(5.2,6.05) |
+----------------+
|(133.42,144.95) |
+----------------+

우리는 여기서 이진 연산자를 생성하는 방법을 보여주었습니다. 생성하려면 단항 연산자인 경우 leftarg(왼쪽 단항의 경우) 중 하나를 생략하거나 rightarg(오른쪽 단항의 경우). 프로시저 절과 인수 절은 CREATE OPERATOR의 유일한 필수 항목입니다. 는 예제에 표시된 COMMUTATOR 절은 다음 항목에 대한 선택적 힌트입니다. 쿼리 최적화 프로그램. COMMUTATOR 및 기타에 대한 자세한 내용 최적화 프로그램 힌트가 아래에 나타납니다.

15.1. 운영자 최적화 정보

저자:톰 레인 작성.

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

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

15.1.1. 정류기

COMMUTATOR 절이 제공되면 다음과 같은 연산자의 이름을 지정합니다. 정의되는 연산자의 정류자입니다. 우리는 이렇게 말한다 (x A y)가 다음과 같은 경우 연산자 A는 연산자 B의 정류자입니다. (y B x) 가능한 모든 입력 값 x,y에 대해. B는 또한 A의 정류자입니다. 예를 들어 연산자 '<' 및 특정 데이터 유형에 대한 ''는 일반적으로 서로 다릅니다' 정류자 및 연산자 '+'는 일반적으로 다음과 교환 가능합니다. 그 자체. 그러나 연산자 '-'는 일반적으로 다음과 교환 가능하지 않습니다. 무엇이든.

교환된 윈 토토의 왼쪽 인수 유형이 동일합니다. 정류자의 올바른 인수 유형으로, 그 반대의 경우도 마찬가지입니다. 따라서 정류자 윈 토토의 이름은 그게 전부입니다.포스트그레스제공되어야 함 정류자를 찾으려면 그게 전부입니다. COMMUTATOR 절에 제공됩니다.

자체 교환 윈 토토를 정의할 때, 그냥 하세요. 가환 쌍을 정의할 때 윈 토토, 상황이 조금 더 까다롭습니다. 첫 번째는 어떻게 할 수 있습니까? 정의할 하나는 아직 정의하지 않은 다른 하나를 참조합니다. 아직 정의되지 않았나요? 이 문제에는 두 가지 해결책이 있습니다.

  • 한 가지 방법은 첫 번째 항목에서 COMMUTATOR 절을 생략하는 것입니다. 연산자를 정의한 다음 두 번째 연산자의 정의. 이후포스트그레스교환 가능하다는 것을 알고 있습니다 연산자는 두 번째를 볼 때 쌍으로 옵니다. 정의는 자동으로 돌아가서 다음을 채울 것입니다. 첫 번째 정의에 COMMUTATOR 절이 누락되었습니다.

  • 다른 더 간단한 방법은 다음을 포함하는 것입니다. 두 정의 모두 COMMUTATOR 절이 있습니다. 언제포스트그레첫 번째 처리 정의하고 COMMUTATOR가 존재하지 않는 윈 토토, 시스템은 더미 항목을 만듭니다. 시스템의 pg_operator 테이블에 있는 해당 윈 토토에 대해. 이 더미 항목에는 운영자에게만 유효한 데이터가 있습니다. 이름, 왼쪽 및 오른쪽 인수 유형, 결과 유형, 그게 다이니까포스트그레스이 시점에서 추론할 수 있습니다. 첫 번째 운영자의 카탈로그 항목은 다음으로 연결됩니다. 더미 입장. 나중에 두 번째 연산자를 정의할 때 시스템은 추가 항목으로 더미 항목을 업데이트합니다. 두 번째 정의의 정보. 사용하려고 하면 채워지기 전에 더미 연산자를 사용하면 그냥 오류 메시지가 나타납니다. (참고: 이 절차는 안정적으로 작업하세요포스트그레6.5 이전 버전이지만 이제는 작업을 수행하는 데 권장되는 방법입니다.)

15.1.2. 부정자

NEGATOR 절이 제공되면 다음과 같은 연산자의 이름을 지정합니다. 정의되는 연산자의 부정자입니다. 우리는 이렇게 말한다 연산자 A는 둘 다 반환되는 경우 연산자 B의 부정자입니다. 부울 결과이며 (x A y)는 모든 항목에 대해 NOT (x B y)와 같습니다. 가능한 입력 x,y. B는 A의 부정자이기도 합니다. 예를 들어 '<' 및 '='는 대부분의 경우 부정자 쌍입니다. 데이터 유형. 연산자는 유효하게 자신의 것일 수 없습니다. 부정자.

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

윈 토토의 부정자는 왼쪽 및/또는 오른쪽이 동일해야 합니다 인수 유형을 윈 토토 자체로 지정하므로 with COMMUTATOR, 윈 토토 이름만 입력하면 됩니다. NEGATOR 절.

NEGATOR 제공은 쿼리 최적화 프로그램에 매우 도움이 됩니다 NOT (x = y)와 같은 표현식을 단순화할 수 있기 때문입니다. x < y로. 생각보다 자주 이런 일이 일어납니다. NOT은 다른 결과로 삽입될 수 있기 때문에 생각하십시오. 재배치.

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

15.1.3. 제한

RESTRICT 절이 제공되면 제한사항의 이름을 지정합니다. 운영자를 위한 선택성 추정 기능(참고 이는 연산자 이름이 아닌 함수 이름입니다.) 제한 절은 다음을 반환하는 이항 연산자에만 의미가 있습니다. 부울. 제한 선택성 추정기의 기본 아이디어 테이블의 행 중 몇 부분이 만족할지 추측하는 것입니다. 양식의 WHERE 절 조건

필드 OP 상수
현재 연산자 및 특정 상수 값에 대해. 이는 행 수에 대한 아이디어를 제공하여 최적화 프로그램을 지원합니다. 이 형식의 WHERE 절에 의해 제거됩니다. (뭐.. 상수가 왼쪽에 있으면 어떤 일이 발생하는지 궁금할 것입니다. 글쎄, 이것이 COMMUTATOR의 목적 중 하나입니다...)

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

eqsel for =
        <에 대한 neqsel
        < 또는 <=에 대한 scalarltsel
         또는 =에 대한 scalargtsel
이것이 카테고리라는 것이 조금 이상해 보일 수도 있지만, 당신이 그것에 대해 생각한다면 그것은 의미가 있습니다. '='는 일반적으로 허용됩니다. 테이블에 있는 행의 작은 부분만; '<'는 일반적으로 작은 부분만 거부합니다. '<'는 주어진 상수가 어디에 속하는지에 따라 달라지는 분수 해당 테이블 열의 값 범위(이런 일이 발생하면 VACUUM ANALYZE에 의해 수집되어 다음 사용자에게 제공되는 정보입니다. 선택성 추정기). '<='는 약간 더 큰 크기를 허용합니다. 동일한 비교 상수에 대해 '<'보다 분수가 있지만 구별할 가치가 없을 만큼 가깝습니다. 특히 우리는 어쨌든 대략적인 추측보다 더 나은 결과를 얻을 가능성은 없습니다. 비슷한 말 '' 및 '='에 적용됩니다.

당신은 eqsel이나 매우 높거나 매우 낮은 연산자를 위한 neqsel 실제로 동등하지 않거나 동등하지 않더라도 선택성 불평등. 예를 들어, 근사-등등 기하학 연산자는 일반적으로 다음과 같은 가정하에 eqsel을 사용합니다. 테이블에 있는 항목 중 작은 부분만 일치합니다.

비교를 위해 scalarltsel 및 scalargtsel을 사용할 수 있습니다. 변환할 수 있는 합리적인 수단이 있는 데이터 유형 범위 비교를 위해 숫자 스칼라로 변환합니다. 가능하다면 추가하세요. 루틴이 이해하는 데이터 유형 src/backend/utils/adt/selfuncs.c의 Convert_to_scalar() (결국 이 루틴은 데이터 유형별 루틴으로 대체되어야 합니다. pg_type 테이블의 열을 통해 식별되는 함수 하지만 그런 일은 아직 일어나지 않았습니다.) 이렇게 하지 않으면 상황이 여전히 작동하지만 최적화 프로그램의 추정치는 다음과 같지 않습니다. 좋을 대로야.

다음을 위해 설계된 추가 선택 기능이 있습니다. src/backend/utils/adt/geo_selfuncs.c의 기하학적 연산자: Areasel, positionel 및 contsel. 이 글을 쓰는 시점에서 이것들은 스텁일 뿐이지만 이를 사용하고 싶을 수도 있습니다(또는 더 나은 방법은 개선하세요) 어쨌든.

15.1.4. 가입

JOIN 절이 제공되면 조인 선택성의 이름을 지정합니다 연산자에 대한 추정 함수(이것은 연산자 이름이 아닌 함수 이름). JOIN 절은 다음을 수행합니다. 부울을 반환하는 이항 연산자에 대한 의미입니다. 아이디어 조인 선택성 추정기 뒤에 있는 것은 몇 분의 1인지 추측하는 것입니다. 한 쌍의 테이블에 있는 행 중 WHERE 절을 충족합니다. 양식의 조건

table1.field1 OP table2.field2
현재 운영자에 대한 것입니다. RESTRICT 절과 마찬가지로 이는 이를 파악함으로써 옵티마이저가 매우 실질적으로 도움을 줍니다. 여러 가능한 조인 시퀀스 중 어느 것이 최소한의 일.

이전과 마찬가지로 이 장에서는 설명을 시도하지 않습니다. 조인 선택성 추정 함수를 작성하는 방법은 무엇입니까? 다음과 같은 경우에는 표준 추정기 중 하나를 사용하는 것이 좋습니다. 하나가 적용 가능합니다:

eqjoinsel for =
        <에 대한 neqjoinsel
        < 또는 <=에 대한 scalarltjoinsel
         또는 =에 대한 scalargtjoinsel
        2D 영역 기반 비교를 위한 AreaJoinsel
        2D 위치 기반 비교를 위한 positionjoinsel
        2D 포함 기반 비교를 위한 contjoinsel

15.1.5. 해시

HASHES 절이 있는 경우 시스템에 이를 알립니다. 이를 기반으로 조인에 해시 조인 방법을 사용해도 좋습니다. 운영자. HASHES는 다음과 같은 이진 연산자에만 적합합니다. 부울을 반환하고 실제로 연산자는 일부 데이터 유형의 동일성.

해시 조인의 기본 가정은 조인이 윈 토토는 왼쪽과 오른쪽 쌍에 대해서만 TRUE를 반환할 수 있습니다. 동일한 해시 코드로 해시되는 값입니다. 두 개의 값이 입력되면 다른 해시 버킷에서는 조인이 이를 비교하지 않습니다. 암묵적으로 조인의 결과를 가정합니다. 윈 토토는 FALSE여야 합니다. 따라서 지정하는 것은 결코 의미가 없습니다. 동등성을 나타내지 않는 윈 토토에 대한 해시입니다.

사실 논리적 평등도 충분하지 않습니다. 는 연산자는 순수한 비트 동등성을 더 잘 표현해야 합니다. 왜냐하면 해시 함수는 메모리에서 계산됩니다. 비트에 관계없이 값 표현 뜻. 예를 들어, 시간 간격의 동일성은 비트 단위가 아닙니다. 평등; 간격 동등 연산자는 두 시간을 고려합니다. 간격이 동일하면 기간이 동일합니다. 끝점이 동일하지 않습니다. 이것이 의미하는 바는 간격 필드 사이에 "="를 사용하여 조인하면 결과가 달라집니다. 구현된 경우보다 해시 조인으로 구현된 경우의 결과 다른 방법으로는, 쌍의 상당 부분이 일치해야 하며 다른 값으로 해시되며 절대 일치하지 않습니다. 해시 조인으로 비교합니다. 그러나 최적화 프로그램이 사용하기로 선택한 경우 다른 종류의 조인, 동등성을 보장하는 모든 쌍 연산자는 같음을 찾을 것이라고 말합니다. 우리는 그것을 원하지 않습니다 일종의 불일치이므로 간격 동일성을 다음과 같이 표시하지 않습니다. 해시 가능.

해시 조인을 수행하는 기계 의존적인 방법도 있습니다 옳은 일을 하지 못할 수도 있습니다. 예를 들어, 귀하의 경우 데이터 유형은 흥미롭지 않을 수 있는 구조입니다. 패드 비트의 경우 같음 연산자 HASHES를 표시하는 것은 안전하지 않습니다. (아마도 다른 연산자를 작성하여 사용되지 않은 비트는 항상 0입니다.) 또 다른 예는 다음과 같습니다. FLOAT 데이터 유형은 해시 조인에 안전하지 않습니다. 켜짐 IEEE 부동 소수점 표준을 충족하는 머신에서 마이너스 0과 더하기 0은 다른 값입니다(다른 비트 패턴) 그러나 동일함을 비교하기 위해 정의됩니다. 그래서 플로트라면 평등은 HASHES, 마이너스 0 및 플러스 0으로 표시되었습니다. 아마도 해시 조인과 일치하지 않을 수도 있지만 다른 가입 프로세스와 일치하게 됩니다.

결론은 아마도 동등 윈 토토에 대한 HASHES(또는 그럴 수 있음) memcmp()에 의해 구현됩니다.

15.1.6. SORT1 및 SORT2

SORT 절이 있는 경우 시스템에 이를 알립니다. 다음을 기반으로 하는 조인에 대해 병합 조인 방법을 사용하는 것이 허용됩니다. 현재 운영자. 둘 중 하나가 있으면 둘 다 지정해야 합니다. 현재 연산자는 일부 데이터 쌍에 대해 동일해야 합니다. 유형, SORT1 및 SORT2 절은 순서 이름을 지정합니다. 왼쪽 및 오른쪽 데이터에 대한 연산자('<' 연산자) 각각 유형을 지정합니다.

병합 조인은 왼쪽 및 오른쪽 정렬 아이디어를 기반으로 합니다. 오른쪽 테이블을 순서대로 정렬한 다음 스캔합니다. 평행. 따라서 두 데이터 유형 모두 완전히 가능해야 합니다. 순서가 지정되어 있으며 조인 연산자는 다음과 같은 연산자만 사용할 수 있어야 합니다. "동일한 위치"에 있는 값 쌍에 대해 성공합니다. 정렬 순서. 실제로 이는 조인 연산자가 평등하게 행동해야합니다. 하지만 해시조인과 달리 왼쪽과 오른쪽 데이터 유형이 동일해야 합니다(또는 적어도 비트 단위 등가), 서로 다른 두 개의 병합 조인이 가능합니다. 논리적으로 호환되는 데이터 유형입니다. 에 대한 예를 들어, int2-versus-int4 동등 연산자는 다음과 같습니다. 병합 가능. 우리는 다음을 가져올 정렬 연산자만 필요합니다. 두 데이터 유형을 논리적으로 호환되는 시퀀스로 변환합니다.

병합 정렬 연산자를 지정할 때 현재 연산자는 참조된 두 연산자 모두 부울을 반환해야 합니다. SORT1 연산자는 현재와 동일한 입력 데이터 유형을 모두 가져야 합니다. 연산자의 왼쪽 인수 유형이며 SORT2 연산자는 다음과 같아야 합니다. 현재 연산자의 입력 데이터 유형과 동일한 두 입력 데이터 유형을 모두 갖습니다. 올바른 인수 유형. (COMMUTATOR 및 NEGATOR와 마찬가지로 이는 이는 연산자 이름이 다음을 지정하기에 충분하다는 것을 의미합니다. 연산자, 그리고 시스템은 더미 연산자를 만들 수 있습니다 이전에 같음 연산자를 정의한 경우 항목 다른 것.)

실제로는 '='에 대해서만 SORT 절을 작성해야 합니다 윈 토토이며 참조된 두 윈 토토는 항상 이름은 '<'입니다. 이름이 지정된 윈 토토와 병합 조인을 사용하려고 합니다. 다른 어떤 것도 절망적인 혼란을 초래할 것입니다. 잠시 후에 보도록 하겠습니다.

연산자에 대한 추가 제한사항이 있습니다. 병합 가능으로 표시합니다. 이러한 제한사항은 현재 적용되지 않습니다. CREATE OPERATOR로 확인했지만 병합 조인이 실패할 수 있습니다. 런타임에 true가 아닌 경우:

  • 병합 결합 가능한 동등 연산자에는 다음이 있어야 합니다. 정류자(두 데이터 유형이 동일한 경우 자체, 또는 서로 다른 경우 관련된 항등 연산자).

  • '<' 및 '' 순서 윈 토토가 있어야 합니다 왼쪽 및 오른쪽 입력 데이터 유형이 동일합니다. mergejoinable 윈 토토 자체. 이들 윈 토토반드시'<' 및 ''로 명명됩니다. 당신은 그렇습니다 이 문제에 대해서는 선택의 여지가 없습니다. 왜냐하면 아무 것도 없기 때문입니다. 명시적으로 지정하는 규정. 만약에 참고하세요 왼쪽과 오른쪽 데이터 유형이 서로 다릅니다. 이러한 윈 토토는 SORT 윈 토토와 동일합니다. 하지만 그들은 데이터 값을 SORT 윈 토토 또는 mergejoin이 작동하지 않습니다.