2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

F.10.  cube — 多維立方體資料型別 #

本模組實現了一個名為 cube 的資料型別,用於表示多維立方體。

此模組被認為是受信任的,這意味著非超級使用者也可以在其擁有的資料庫上安裝它,前提是他們具有 CREATE 許可權。

F.10.1.  語法 #

表 F.1 顯示了 cube 型別的有效外部表示。 xy 等表示浮點數。

表 F.1. Cube 外部表示

外部語法 含義
x 一維點(或零長度的一維區間)
(x) 同上
x1,x2,...,xn n 維空間中的一個點,在內部表示為一個零體積的立方體
(x1,x2,...,xn) 同上
(x),(y) 一維區間,起始點為 x,終點為 y,或反之;順序無關緊要
[(x),(y)] 同上
(x1,...,xn),(y1,...,yn) 一個 n 維立方體,由其對角線上的兩個頂點表示
[(x1,...,xn),(y1,...,yn)] 同上

輸入對角頂點時,它們的順序並不重要。 cube 函式會自動交換值以建立統一的“左下 - 右上”內部表示。當頂點重合時,cube 只儲存一個頂點並帶有一個“是點”標誌,以避免浪費空間。

輸入時會忽略空格,因此 [(x),(y)][ ( x ), ( y ) ] 相同。

F.10.2.  精度 #

值以 64 位浮點數形式儲存。這意味著超過約 16 位有效數字的數字將被截斷。

F.10.3.  用法 #

表 F.2 顯示了為 cube 型別提供的專用運算子。

表 F.2. Cube 運算子

運算子

描述

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 型別還支援 表 9.1 中顯示的常規比較運算子。這些運算子首先比較第一個座標,如果它們相等,則比較第二個座標,依此類推。它們主要用於支援 cube 的 b-tree 索引運算子類,例如,當您希望對 cube 列設定 UNIQUE 約束時,這可能很有用。否則,這種排序的實際用途不大。

cube 模組還為 cube 值提供了一個 GiST 索引運算子類。 cube GiST 索引可用於在 WHERE 子句中使用 =&&@><@ 運算子搜尋值。

此外,cube GiST 索引還可用於使用 ORDER BY 子句中的度量運算子 <-><#><=> 來查詢最近鄰。例如,可以使用以下命令高效地查詢 3D 點 (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;

以及按右上角第一個座標降序排序的 2D 立方體:

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

表 F.3 顯示了可用的函式。

表 F.3. Cube 函式

函式

描述

示例

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; extra 座標的初始值設為 0。此函式對於建立點周圍的邊界框以搜尋附近的點很有用。

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


F.10.4.  預設值 #

此並集

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.10.5.  注意事項 #

有關用法示例,請參見迴歸測試 sql/cube.sql

為了增加安全性,立方體的維度數量限制為 100。如果需要更大的尺寸,可以在 cubedata.h 中進行設定。

F.10.6.  致謝 #

原作者:Gene Selkov, Jr. ,阿貢國家實驗室數學與計算機科學部。

我最感謝的是 Joe Hellerstein 教授(https://dsf.berkeley.edu/jmh/),他闡明瞭 GiST 的核心思想(http://gist.cs.berkeley.edu/),以及他的前學生 Andy Dong 為 Illustra 編寫的示例。我還感謝所有 Postgres 的開發者(現任和前任),他們使我能夠創造自己的世界並安寧地生活其中。我還要感謝阿貢實驗室和美國能源部多年來對我的資料庫研究提供的堅定支援。

Bruno Wolff III 於 2002 年 8 月/9 月對該軟體包進行了小幅更新。這些更新包括將精度從單精度改為雙精度,並添加了一些新函式。

Joshua Reich 於 2006 年 7 月進行了其他更新。這些更新包括 cube(float8[], float8[]) 函式,以及將程式碼清理為使用 V1 呼叫協議而不是已棄用的 V0 協議。

提交更正

如果您在文件中發現任何不正確之處、與您在使用特定功能時的體驗不符之處,或者需要進一步說明之處,請使用 此表單 報告文件問題。