景
多维空间对象的几何运算,高效率检索实践。
例如我们在数据库中存储了多维几何对象,可以使用lower, upper的数组来表达,例如3维度对象:
CUBE
[
xmin1
ymin1
zmin1
,
xmax1
ymax1
zmax1
]
在介绍CUBE类型前,我们可以使用6个字段(xmin,xmax,ymin,ymax,zmin,zmax)来表达一个立方体。
包含和相交查询
在介绍CUBE类型前,我们如果使用6个字段来表达立方体,那么相交,包含分别如何标示呢?
包含:
(xmin1 <= xmin2 and xmax1 >= xmax2)
and
(ymin1 <= ymin2 and ymax1 >= ymax2)
and
(zmin1 <= zmin2 and zmax1 >= zmax2)
相交:
每个坐标都相交,注意任意坐标相交的方位有
-----
或
-----
或
---
或
---
或
或
---
每条边都有相交即CUBE相交,表达如下
((xmin1 >= xmin2 and xmin1 <= xmax2) or (xmax1 >= xmin2 and xmax1 <= xmax2) or (xmin1 <= xmin2 and xmax1 >= xmax2))
and
((ymin1 >= ymin2 and ymin1 <= ymax2) or (ymax1 >= ymin2 and ymax1 <= ymax2) or (ymin1 <= ymin2 and ymax1 >= ymax2))
and
((zmin1 >= zmin2 and zmin1 <= zmax2) or (zmax1 >= zmin2 and zmax1 <= zmax2) or (zmin1 <= zmin2 and zmax1 >= zmax2))
使用6个字段的空间计算性能
1、创建测试表
create table test1 (
id int primary key,
x_min int,
y_min int,
z_min int,
x_max int,
y_max int,
z_max int
);
2、写入100万记录
insert into test1 select id, x, y, z, x+1+(random()100)::int, y+1+(random()100)::int, z+1+(random()*100)::int
from (select id, (random()1000)::int x, (random()1000)::int y, (random()*1000)::int z from generate_series(1,1000000) t(id)) t ;
记录如下
postgres=# select * from test1 limit 10;
id | x_min | y_min | z_min | x_max | y_max | z_max |
---|---|---|---|---|---|---|
1 | 37 | 367 | 948 | 93 | 372 | 989 |
2 | 994 | 543 | 596 | 1031 | 613 | 617 |
3 | 399 | 616 | 897 | 444 | 624 | 959 |
4 | 911 | 624 | 67 | 1007 | 705 | 84 |
5 | 286 | 560 | 882 | 334 | 632 | 936 |
6 | 370 | 748 | 897 | 403 | 779 | 992 |
7 | 723 | 292 | 484 | 756 | 358 | 503 |
8 | 514 | 48 | 792 | 556 | 98 | 879 |
9 | 17 | 400 | 485 | 26 | 435 | 514 |
10 | 240</ |