F.11. 와이즈 토토 — 다차원 와이즈 토토 데이터 유형#

이 모듈은 데이터 유형을 구현합니다.와이즈 토토다차원 와이즈 토토를 표현하기 위한 것입니다.

이 모듈은 고려됩니다.신뢰할 수 있는, 즉, 슈퍼유저가 아닌 사용자가 설치할 수 있습니다.만들기현재 데이터베이스에 대한 권한입니다.

F.11.1. 구문#

표 F.2에 대한 유효한 외부 표현을 보여줍니다.와이즈 토토유형.x, y등은 부동 소수점 숫자를 나타냅니다.

표 F.2. 와이즈 토토 외부 표현

외부 구문 의미
x 1차원 점(또는 길이가 0인 1차원 간격)
(x) 위와 동일
x1,x2,...,xn n차원 공간의 한 점, 내부적으로 부피가 0인 와이즈 토토로 표현됨
(x1,x2,...,xn) 위와 동일
(x),(y) 다음에서 시작하는 1차원 간격x그리고 종료 시간:y또는 그 반대로; 순서는 중요하지 않습니다.
[(x),(y)] 위와 동일
(x1,...,xn),(y1,...,yn) 대각선으로 반대쪽 모서리 쌍으로 표현되는 n차원 와이즈 토토
[(x1,...,xn),(y1,...,yn)] 위와 동일

와이즈 토토의 반대쪽 모서리가 어떤 순서로 입력되는지는 중요하지 않습니다.와이즈 토토유니폼을 생성하는 데 필요한 경우 함수가 자동으로 값을 교환왼쪽 하단 — 오른쪽 상단내부 표현. 모서리가 일치하면,와이즈 토토다음과 함께 한 모서리만 저장합니다.점입니다공간 낭비를 방지하기 위한 플래그입니다.

공백은 입력 시 무시되므로[(x),(y)]다음과 같습니다[ ( x ), ( y ) ].

F.11.2. 정밀도#

값은 내부적으로 64비트 부동 소수점 숫자로 저장됩니다. 즉, 유효 숫자가 약 16자리를 초과하면 잘립니다.

F.11.3. 사용법#

표 F.3유형에 제공된 특수 연산자를 표시와이즈 토토.

표 F.3. 와이즈 토토 연산자

운영자

설명

와이즈 토토 && 와이즈 토토부울

와이즈 토토가 겹치나요?

와이즈 토토 @ 와이즈 토토부울

첫 번째 와이즈 토토에 두 번째 와이즈 토토가 포함되어 있습니까?

와이즈 토토 <@ 와이즈 토토부울

첫 번째 와이즈 토토가 두 번째 와이즈 토토에 포함되어 있습니까?

와이즈 토토 - 정수float8

추출n-와이즈 토토의 번째 좌표(1부터 계산).

와이즈 토토 ~ 정수float8

추출n-다음 방법으로 계산되는 와이즈 토토의 번째 좌표:n = 2 * k- 1은 하한을 의미합니다.k-번째 차원,n = 2 * k상한을 의미함k-번째 차원. 부정적인n은 해당 양의 좌표의 역수 값을 나타냅니다. 이 연산자는 KNN-GiST 지원을 위해 설계되었습니다.

와이즈 토토 <- 와이즈 토토float8

두 와이즈 토토 사이의 유클리드 거리를 계산합니다.

와이즈 토토 <# 와이즈 토토float8

두 와이즈 토토 사이의 택시(L-1 미터법) 거리를 계산합니다.

와이즈 토토 <= 와이즈 토토float8

두 와이즈 토토 사이의 체비쇼프(L-inf 미터법) 거리를 계산합니다.


위의 연산자 외에도 다음과 같은 일반적인 비교 연산자가 있습니다.표 9.1유형에 사용 가능와이즈 토토. 이 연산자는 먼저 첫 번째 좌표를 비교하고, 같으면 두 번째 좌표를 비교합니다. 주로 b-tree 인덱스 연산자 클래스를 지원하기 위해 존재합니다.와이즈 토토, 예를 들어 UNIQUE 제약 조건을 원하는 경우에 유용할 수 있습니다.와이즈 토토열. 그렇지 않으면 이 순서는 실용적이지 않습니다.

와이즈 토토모듈은 다음을 위한 GiST 인덱스 연산자 클래스도 제공합니다.와이즈 토토값. 갑와이즈 토토GiST 인덱스는 다음을 사용하여 값을 검색하는 데 사용할 수 있습니다.=, &&, @<@연산자어디절.

또한, a와이즈 토토GiST 인덱스는 메트릭 연산자를 사용하여 가장 가까운 이웃을 찾는 데 사용할 수 있습니다.<-, <#<=주문 기준절. 예를 들어, 3차원 점(0.5, 0.5, 0.5)의 가장 가까운 이웃은 다음을 사용하여 효율적으로 찾을 수 있습니다.

테스트에서 c 선택 ORDER BY c <- 와이즈 토토(배열[0.5,0.5,0.5]) LIMIT 1;

~연산자를 이러한 방식으로 사용하면 선택한 좌표로 정렬된 처음 몇 개의 값을 효율적으로 검색할 수도 있습니다. 예를 들어, 첫 번째 좌표(왼쪽 아래 모서리)를 기준으로 오름차순으로 정렬된 처음 몇 개의 와이즈 토토를 얻으려면 다음 쿼리를 사용할 수 있습니다.

테스트에서 c 선택 ORDER BY c ~ 1 LIMIT 5;

그리고 오른쪽 상단 모서리의 첫 번째 좌표가 내림차순으로 정렬된 2D 와이즈 토토를 얻으려면:

테스트에서 c 선택 ORDER BY c ~ 3 DESC LIMIT 5;

표 F.4사용 가능한 기능을 보여줍니다.

표 F.4. 와이즈 토토 함수

기능

설명

와이즈 토토 ( float8 ) → 와이즈 토토

두 좌표가 동일한 1차원 와이즈 토토를 만듭니다.

와이즈 토토(1)(1)

와이즈 토토 ( float8, float8 ) → 와이즈 토토

1차원 와이즈 토토를 만듭니다.

와이즈 토토(1, 2)(1),(2)

와이즈 토토 ( float8[] ) → 와이즈 토토

배열에 의해 정의된 좌표를 사용하여 부피가 0인 와이즈 토토를 만듭니다.

와이즈 토토(ARRAY[1,2,3])(1, 2, 3)

와이즈 토토 ( float8[], float8[] ) → 와이즈 토토

두 개의 배열에 의해 정의된 오른쪽 상단과 왼쪽 하단 좌표를 가진 와이즈 토토를 만듭니다. 길이는 같아야 합니다.

와이즈 토토(ARRAY[1,2], ARRAY[3,4])(1, 2),(3, 4)

와이즈 토토 ( 와이즈 토토, float8 ) → 와이즈 토토

새 좌표의 두 끝점에 대해 동일한 값을 사용하여 기존 와이즈 토토에 차원을 추가하여 새 와이즈 토토를 만듭니다. 이는 계산된 값을 바탕으로 와이즈 토토를 하나씩 만드는 데 유용합니다.

와이즈 토토('(1,2),(3,4)'::와이즈 토토, 5)(1, 2, 5),(3, 4, 5)

와이즈 토토 ( 와이즈 토토, float8, float8 ) → 와이즈 토토

기존 와이즈 토토에 차원을 추가하여 새 와이즈 토토를 만듭니다. 이는 계산된 값을 바탕으로 와이즈 토토를 하나씩 만드는 데 유용합니다.

와이즈 토토('(1,2),(3,4)'::와이즈 토토, 5, 6)(1, 2, 5),(3, 4, 6)

cube_dim ( 와이즈 토토 ) → 정수

와이즈 토토의 차원 수를 반환합니다.

cube_dim('(1,2),(3,4)')2

cube_ll_coord ( 와이즈 토토, 정수 ) → float8

반환n-와이즈 토토의 왼쪽 하단 모서리에 대한 번째 좌표 값입니다.

cube_ll_coord('(1,2),(3,4)', 2)2

cube_ur_coord ( 와이즈 토토, 정수 ) → float8

다음을 반환합니다n-와이즈 토토의 오른쪽 상단 모서리에 대한 번째 좌표 값입니다.

cube_ur_coord('(1,2),(3,4)', 2)4

cube_is_point ( 와이즈 토토 ) → 부울

와이즈 토토가 점인 경우, 즉 정의하는 두 모서리가 동일한 경우 참을 반환합니다.

cube_is_point(와이즈 토토(1,1))t

와이즈 토토_거리 ( 와이즈 토토, 와이즈 토토 ) → float8

두 와이즈 토토 사이의 거리를 반환합니다. 두 와이즈 토토가 모두 점인 경우 이는 일반적인 거리 함수입니다.

와이즈 토토_거리('(1,2)', '(3,4)')2.8284271247461903

와이즈 토토_하위 집합 ( 와이즈 토토, 정수[] ) → 와이즈 토토

배열의 차원 인덱스 목록을 사용하여 기존 와이즈 토토에서 새 와이즈 토토를 만듭니다. 단일 차원의 끝점을 추출하거나 차원을 삭제하거나 원하는 대로 재정렬하는 데 사용할 수 있습니다.

cube_subset(와이즈 토토('(1,3,5),(6,7,8)'), ARRAY[2])(3),(7)

cube_subset(와이즈 토토('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1])(5, 3, 1, 1),(8, 7, 6, 6)

와이즈 토토_유니온 ( 와이즈 토토, 와이즈 토토 ) → 와이즈 토토

두 와이즈 토토의 결합을 생성합니다.

cube_union('(1,2)', '(3,4)')(1, 2),(3, 4)

cube_inter ( 와이즈 토토, 와이즈 토토 ) → 와이즈 토토

두 와이즈 토토의 교차점을 생성합니다.

cube_inter('(1,2)', '(3,4)')(3, 4),(1, 2)

cube_enlarge ( c 와이즈 토토, r 더블, n 정수 ) → 와이즈 토토

지정된 반경만큼 와이즈 토토의 크기를 증가시킵니다.r적어도n치수. 반지름이 음수이면 와이즈 토토가 대신 축소됩니다. 정의된 모든 치수는 반경에 따라 변경됩니다.r. 왼쪽 하단 좌표가 감소합니다.r그리고 오른쪽 상단 좌표는 다음만큼 증가합니다.r. 왼쪽 아래 좌표가 해당 오른쪽 위 좌표보다 크게 증가하는 경우(이는 다음 경우에만 발생할 수 있습니다.r< 0) 두 좌표 모두 평균으로 설정됩니다. 만일n이(가) 정의된 차원 수보다 크고 와이즈 토토가 확대되고 있습니다. (r 0), 추가 차원이 추가되어 다음을 만듭니다.n모두; 추가 좌표의 초기값은 0을 사용합니다. 이 기능은 가까운 지점을 검색하기 위해 지점 주위에 경계 상자를 만드는 데 유용합니다.

cube_enlarge('(1,2),(3,4)', 0.5, 3)(0.5, 1.5, -0.5),(3.5, 4.5, 0.5)


F.11.4. 기본값#

이 조합:

select Cube_union('(0,5,2),(2,3,1)', '0');
와이즈 토토_유니온
------
(0, 0, 0),(2, 5, 2)
(1행)

상식과 모순되지 않으며 교차점도 마찬가지입니다.

select Cube_inter('(0,-1),(1,1)', '(-2),(2)');
와이즈 토토_인터
-------------
(0, 0),(1, 0)
(1행)

다른 차원의 와이즈 토토에 대한 모든 이진 연산에서 낮은 차원의 와이즈 토토는 데카르트 투영으로 가정됩니다. 즉, 즉, 문자열 표현에서 생략된 좌표 자리에 0이 있습니다. 위의 예는 다음과 같습니다.

cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)');
Cube_inter('(0,-1),(1,1)','(-2,0),(2,0)');

다음 포함 조건자는 포인트 구문을 사용하지만 실제로 두 번째 인수는 내부적으로 상자로 표시됩니다. 이 구문을 사용하면 (box,point) 조건자에 대해 별도의 포인트 유형과 함수를 정의할 필요가 없습니다.

select Cube_contains('(0,0),(1,1)', '0.5,0.5');
와이즈 토토_포함
--------------
티
(1행)

F.11.5. 참고#

사용 예는 회귀 테스트를 참조하세요.sql/cube.sql.

사람들이 물건을 깨기 어렵게 만들기 위해 와이즈 토토의 차원 수는 100으로 제한되어 있습니다. 이것은에서 설정됩니다.cubedata.h더 큰 것이 필요하다면.

F.11.6. 크레딧#

원저자: Gene Selkov, Jr., 아르곤 국립 연구소 수학과 컴퓨터 공학부.

저는 주로 Joe Hellerstein 교수에게 감사드립니다 (https://dsf.berkeley.edu/jmh/) GiST의 요점을 설명하기 위한 것입니다(http://gist.cs.berkeley.edu/) 및 Illustra에 예시를 제공한 그의 전 학생인 Andy Dong에게도 감사드립니다. 또한 나만의 세계를 만들고 그 안에서 방해받지 않고 살아갈 수 있도록 도와준 현재와 과거의 모든 Postgres 개발자들에게도 감사드립니다. 그리고 수년 동안 내 데이터베이스 연구를 성실하게 지원해 준 Argonne Lab과 미국 에너지부에 감사의 말씀을 전하고 싶습니다.

이 패키지에 대한 사소한 업데이트는 Bruno Wolff III에 의해 이루어졌습니다.2002년 8월/9월. 여기에는 정밀도를 단정밀도에서 배정밀도로 변경하고 몇 가지 새로운 기능을 추가하는 것이 포함됩니다.

Joshua Reich가 추가 업데이트를 했습니다.2006년 7월. 여기에는 다음이 포함됩니다.와이즈 토토(float8[], float8[])그리고 더 이상 사용되지 않는 V0 프로토콜 대신 V1 호출 프로토콜을 사용하도록 코드를 정리합니다.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.