一、目的
本测试在探究在有限的计算机配置下,如何高效地对千万级的空间数据进行空间查询和关键字查询。通过实际操作和测试,评估不同查询策略的性能,为处理大规模空间数据提供可行的解决方案。
计算机配置如下:
- 内存(16G):
- 内存 1 名称为 3200 MHz,大小 8GB,频率 3200 MHz,数据宽度 64。
- 内存 2 名称为 3200 MHz,大小 8GB,频率 3200 MHz,数据宽度 64。
- CPU(AMD 6 核 4600Hz):
- CPU 名称为超微半导体 AMD Ryzen 5 4600H with Radeon Graphics
- 六核,核心数 6,
- 默认频率 3000 MHz,外频 100 MHz,当前频率 3000 MHz,
- 二级缓存为 512-KB,12-way set associative,64-byte line size,
- 三级缓存为 64-KB,18-way set associative,64-byte line size,
- CPU 电压 1.200 V,
- 数据宽度 64。
- 硬盘(SSD):
- 厂商为 Micron MTFDHBA512TDV,大小 512GB。
二、主要思路
- 首先,在给定的计算机配置下,创建一个包含1千万条空间数据的表
random_points
。数据范围假定在经度 100 - 170,纬度在 20 - 70 之间,采用 4326 坐标系。 - 为了更符合一般兴趣点的规则,表中的属性字段
pname
的生成规则为前半部分每 2000 个相同,由md5((id%5000)::text))
的前半部分和md5(random()::text))
的后半部分组成,并进行了两次字符串处理,分别在第五个字符和第九个字符处插入空格。 - 分别为属性字段
pname
和空间字段geom
创建 GIST 类型索引,以提高查询效率。 - 构建一个多边形,然后进行空间查询和关键字查询的组合操作,即查询包含在多边形中,并满足关键字要求的前 100 条记录。
三、主要过程
- 删除和创建表
首先使用以下 SQL 语句删除可能存在的同名表:
drop t**ab**le if exists random_points;
然后使用以下 SQL 语句创建表
random_points
,包含字段id
、空间字段geom
和属性字段pname
。生成的数据范围在经度 100 - 170,纬度在 20 - 70 之间,4326 坐标系。pname
字段存储属性信息,前半部分为md5((id%5000)::text))
,后半部分为md5(random()::text))
。创建表耗时 90s。
create t**ab**le random_points as
with bounds as (
select
100 as origin_x,
20 as origin_y,
70 as width,
50 as height
)
select
id,
ST_Point(width * (random() - 0.5) + origin_x,height * (random() - 0.5) + origin_y,4326)::Geometry(Point,4326) as geom,
concat(
substring(md5