本文共 2171 字,大约阅读时间需要 7 分钟。
PostgreSQL , cube , GiST索引 , 多维 , 欧几里得
CUBE 是 PostgreSQL 中的一个多维数据类型,支持两种多维类型:多维 POINT 和区间(左下 + 右上)。CUBE 提供了几何对象的几何特性搜索和计算功能,包括方位搜索和距离计算,这些搜索都支持 GiST 索引。
通过将多个字段合并成多维 POINT,可以实现对大量数据的高效空间聚集和空间计算。这种多维处理能力使得 CUBE 成为处理复杂几何数据的强大工具。
CUBE 提供了多种表示方式来定义多维数据:
| 外部表示 | 语义描述 |
|---|---|
| x | 一维点(或零长度一维区间) |
| (x) | 与上相同 |
| x1,x2,...,xn | n 维空间中的点,由零体积的立方体表示 |
| (x1,x2,...,xn) | 与上相同 |
| (x),(y) | 一维区间(线段),表示每个维度的最小值(左括号)和最大值(右括号) |
| [(x),(y)] | 与上相同 |
| (x1,...,xn),(y1,...,yn) | n 维立方体,由两个对角线点定义 |
| [(x1,...,xn),(y1,...,yn)] | 与上相同 |
以下是 CUBE 支持的一些操作符及其结果:
| 操作符 | 结果类型 | 描述 |
|---|---|---|
| a = b | boolean | a 和 b 是相同的立方体 |
| a && b | boolean | a 和 b 有重叠 |
| a > b | boolean | a 包含 b |
| a <@ b | boolean | a 被包含在 b 中 |
| a < b | boolean | a 小于 b |
| a <= b | boolean | a 小于或等于 b |
| a > b | boolean | a 大于 b |
| a >= b | boolean | a 大于或等于 b |
| a <@> b | boolean | a 不等于 b |
| a - n | float8 | 获取第 n 个坐标(从 1 开始计数) |
| a ~ n | float8 | 获取第 n 个坐标的“标准化”表示 |
| a <#> b | float8 | 欧几里得距离 |
| a <-> b | float8 | 替代制度距离(曼哈顿距离) |
| a <&> b | float8 | 别称为 Chebyshev 距离 |
以下是一些常用的 CUBE 函数:
| 函数名称 | 返回类型 | 描述 |
|---|---|---|
| cube(float8) | cube | 创建一个一维点立方体 |
| cube(float8, float8) | cube | 创建一个一维区间 |
| cube(float8[]) | cube | 创建一个零体积立方体 |
| cube(float8[], float8[]) | cube | 创建一个立方体,由两个对角线点定义 |
| cube(cube, float8) | cube | 在现有立方体上增加一个维度 |
| cube(cube, float8, float8) | cube | 类似于上述方法,增加多个维度 |
| cube_dim(cube) | integer | 返回立方体的维度数量 |
| cube_ll_coord(cube, integer) | float8 | 获取立方体的第 n 个下左角坐标 |
| cube_ur_coord(cube, integer) | float8 | 获取立方体的第 n 个上右角坐标 |
| cube_is_point(cube) | boolean | 检查立方体是否为点(两端点相同) |
| cube_distance(cube, cube) | float8 | 计算两个立方体之间的距离 |
| cube_subset(cube, integer[]) | cube | 从现有立方体中提取子立方体 |
| cube_union(cube, cube) | cube | 计算两个立方体的并集 |
| cube_inter(cube, cube) | cube | 计算两个立方体的交集 |
| cube_enlarge(cube, float8, integer) | cube | 增大立方体的大小 |
以下是一些实际应用示例:
向量聚合(类似多维聚集)通过将多个点合并,可以创建一个多维立方体,实现空间聚集。
4 维(包含)的聚集分析CUBE 数据类型支持多维数据的聚集分析,适用于高维数据处理。
求多维点的距离
SELECT '(1,2,3,4)'::cube <-> '(2,2,3,10)'::cubeSELECT '(1,2,3,4)'::cube <#> '(2,2,3,10)'::cubeSELECT '(1,2,3,4)'::cube <&> '(2,2,3,10)'::cube按距离排序,输出附近的多维点SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;
创建 GiST 索引并聚集存储CREATE INDEX idx ON tbl USING gist (cube(array[c1,c3,c4,c5,c6]))CLUSTER tbl USING idx;
聚集存储后的查询性能提升通过 GiST 索引优化了查询性能,显著提高了数据检索效率。
本文主要介绍了 PostgreSQL CUBE 类型及其 GiST 索引的应用示例和使用方法。通过合理设计多维数据结构,可以高效地执行空间聚集、距离计算等操作。
转载地址:http://lnxfk.baihongyu.com/