Postgresql 中文操作指南

F.11. cube — a multi-dimensional cube data type #

此模块为多维数据集实现了数据类型 cube

此模块被认为是“受信任的”,也就是说,它可以由在当前数据库上具有 CREATE 权限的非超级用户安装。

F.11.1. Syntax #

Table F.2显示了_cube_类型的有效外部表示形式。x、_y_等表示浮点数。

Table F.2. Cube External Representations

External Syntax

Meaning

x

一维点(或零长度一维间隔)

(_x)_

Same as above

x1_,x2,…​,_xn

以零体积立方体形式在内部表示的 n 维空间中的一个点

(_x1,x2,…​,xn)_

Same as above

(_x),(y)_

x 开始到 y 结束或反之的一维区间;顺序无关紧要

[(_x),(y)]_

Same as above

(_x1,…​,xn),(y1,…​,yn)_

由其一对对角线相对的角表示的 n 维立方体

[(_x1,…​,xn),(y1,…​,yn)]_

Same as above

无论按何种顺序输入立方体的相对角,cube 函数将根据需要自动交换值,以创建统一的“左下角——右上角”内部表示形式。当角重合时,cube 仅存储一个角,并使用“是否为点”标志以避免浪费空间。

输入时忽略空白,因此_[(x), (y)]_ 与 [ ( _x),(y)]_ 相同。

F.11.2. Precision #

值在内部以 64 位浮点数的形式存储。这意味着拥有超过 16 个有效数字的数字会被截断。

F.11.3. Usage #

Table F.3显示了为类型_cube_提供的专门运算符。

Table F.3. Cube Operators

Operator

Description

cube && cubeboolean 立方体是否重叠?

cube @> cubeboolean 第一个立方体是否包含第二个?

cube <@ cubeboolean 第二个立方体是否包含第一个?

cube → integerfloat8 提取立方体的 n 坐标(从 1 开始计数)。

cube ~> integerfloat8 按以下方式进行计数,提取立方体的第 n 个坐标: n = 2 * k - 1 表示第 k 维的下限, n = 2 * k 表示第 k 维的上限。负 n 表示相应正坐标的逆值。此运算符专为 KNN-GiST 支持而设计。

cube <→ cubefloat8 计算两个立方体之间的欧几里得距离。

cube <#> cubefloat8 计算两个立方体之间的出租车距离(L-1 度量)。

cube <⇒ cubefloat8 计算两个立方体之间的切比雪夫(L-inf 度量)距离。

除了上述运算符外,类型_cube_还可以使用在 Table 9.1中显示的常用比较运算符。这些运算符首先比较第一个坐标,如果相等,则比较第二个坐标,依此类推。它们主要用于支持_cube_的b树索引运算符类,例如,如果您希望对_cube_列设置UNIQUE约束,这可能很有用。否则,此顺序几乎没有实际用处。

cube_模块还为_cube_值提供了GiST索引操作符类。_cube_GiST索引可用于使用=&&_、@>_和<@_算符在_WHERE_子句中搜索值。

此外,cube_GiST索引可用于使用<→<#>_和_<⇒_计算算符在_ORDER BY_子句中查找最近邻。例如,可以高效地找到3-D点(0.5,0.5,0.5)的最近邻:

SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;

_~>_算符还可以这样使用,以高效地检索按某个选定的坐标排序的前几个值。例如,要按第一个坐标(左下角)升序对前几个立方体进行排序,可以使用以下查询:

SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;

并且按右上角的第一个坐标降序对2-D立方体进行排序:

SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;

Table F.4显示了可用的函数。

Table F.4. Cube Functions

Function

Description

Example(s)

cube ( float8 ) → cube 创建一个一维立方体,其中两个坐标相同。 cube(1)(1)

cube ( float8 , float8 ) → cube 创建一个一维立方体。 cube(1, 2)(1),(2)

cube ( float8[] ) → cube 使用数组定义的坐标创建一个零容量立方体。 cube(ARRAY[1,2,3])(1, 2, 3)

cube ( float8[] , float8[] ) → cube 创建一个立方体,其右上角和左下角坐标由两个数组定义,这两个数组必须具有相同的长度。 cube(ARRAY[1,2], ARRAY[3,4])(1, 2),(3, 4)

cube ( cube , float8 ) → cube 通过在一个现有立方体上添加一个维度来创建一个新的立方体,新坐标的两个端点具有相同的值。这对于从计算值逐个构建立方体非常有用。 cube('(1,2),(3,4)'::cube, 5)(1, 2, 5),(3, 4, 5)

cube ( cube , float8 , float8 ) → cube 通过在一个现有立方体上添加一个维度来创建一个新的立方体。这对于从计算值逐个构建立方体非常有用。 cube('(1,2),(3,4)'::cube, 5, 6)(1, 2, 5),(3, 4, 6)

cube_dim ( cube ) → integer 返回立方体的维度数。 cube_dim('(1,2),(3,4)')2

cube_ll_coord ( cube , integer ) → float8 返回立方体左下角的第 n 个坐标值。 cube_ll_coord('(1,2),(3,4)', 2)2

cube_ur_coord ( cube , integer ) → float8 返回立方体右上角的第 n 个坐标值。 cube_ur_coord('(1,2),(3,4)', 2)4

cube_is_point ( cube ) → boolean 如果立方体是一个点,即定义两个角的点相同,则返回 true。 cube_is_point(cube(1,1))t

cube_distance ( cube , cube ) → float8 返回两个立方体之间的距离。如果两个立方体都是点,则这是正常的距离函数。 cube_distance('(1,2)', '(3,4)')2.8284271247461903

cube_subset ( cube , integer[] ) → cube 使用数组中的维度索引列表,从现有立方体创建一个新的立方体。可用于提取单个维度的端点,或丢弃维度,或根据需要对它们进行重新排序。 cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[2])(3),(7) cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1])(5, 3, 1, 1),(8, 7, 6, 6)

cube_union ( cube , cube ) → cube 生成两个立方体的并集。 cube_union('(1,2)', '(3,4)')(1, 2),(3, 4)

cube_inter ( cube , cube ) → cube 生成两个立方体的交集。 cube_inter('(1,2)', '(3,4)')(3, 4),(1, 2)

cube_enlarge ( c cube , r double , n integer ) → cube 至少在 n 个维度中按指定半径 r 增加立方体的大小。如果半径为负,则立方体将缩小。所有已定义的维度都将按半径 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. Defaults #

此并集:

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

不违背常识,交集也不违背:

select cube_inter('(0,-1),(1,1)', '(-2),(2)');
cube_inter
-------------
(0, 0),(1, 0)
(1 row)

在不同维度立方体上的所有二元操作中,较低维度的一个被认为是笛卡尔投影,即,具有在字符串表示中被忽略的坐标的零。上述例子等同于:

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

以下包含谓词使用点语法,而事实上第二个参数在内部由一个方框表示。此语法消除了定义一个单独的点类型和(方框、点)谓词函数的必要性。

select cube_contains('(0,0),(1,1)', '0.5,0.5');
cube_contains
--------------
t
(1 row)

F.11.5. Notes #

有关使用方法的示例,请参阅回归测试 sql/cube.sql

为了让人们更难破坏组件,对立方体的维数有一个 100 的限制。如果您需要更大的限制,请在 cubedata.h 设置。

F.11.6. Credits #

原始作者:基因塞尔科夫,Jr. < link:mailto:selkovjr@mcs.anl.gov[selkovjr@mcs.anl.gov]> ,数学和计算机科学分部,阿贡国家实验室。

我首先要感谢 Joe Hellerstein 教授 ( https://dsf.berkeley.edu/jmh/) 阐明 GiST ( http://gist.cs.berkeley.edu/) 的要旨,以及他以前的学生 Andy Dong 提供为 Illustra 撰写的示例。我还感谢现在和过去所有的 Postgres 开发人员,让我自己能够创造自己的世界并且安然无恙地生活在其中。我还要感谢阿贡实验室和美国能源部多年来对我数据库研究的坚定支持。

2002 年 8/9 月,布鲁诺沃尔夫三世 < link:mailto:bruno@wolff.to[bruno@wolff.to]> 对这个包进行了小更新。包括将精度从单精度改成双精度并添加一些新函数。

2006 年 7 月,乔舒亚里奇 < link:mailto:josh@root.net[josh@root.net]> 对这个包进行了其他更新。包括 cube(float8[], float8[]) ,并将代码清理干净,不再用已废弃的 V0 协议,而是使用 V1 调用协议。