在 PostGIS 中进行千万级空间数据的空间查询和关键字查询

一、目的

本测试在探究在有限的计算机配置下,如何高效地对千万级的空间数据进行空间查询和关键字查询。通过实际操作和测试,评估不同查询策略的性能,为处理大规模空间数据提供可行的解决方案。

计算机配置如下:

  • 内存(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,为主硬盘,序列号为 00A0_7501_2A3B_3DE6。

二、主要思路

  1. 首先,在给定的计算机配置下,创建一个包含两千万条空间数据的表random_points。数据范围假定在经度 100 - 170,纬度在 20 - 70 之间,采用 4326 坐标系。
  2. 为了更符合一般兴趣点的规则,表中的属性字段pname的生成规则为前半部分每 2000 个相同,由md5((id%5000)::text))的前半部分和md5(random()::text))的后半部分组成,并进行了两次字符串处理,分别在第五个字符和第九个字符处插入空格。
  3. 分别为属性字段pname和空间字段geom创建 GIST 类型索引,以提高查询效率。
  4. 构建一个多边形,然后进行空间查询和关键字查询的组合操作,即查询包含在多边形中,并满足关键字要求的前 100 条记录。

三、主要过程

  1. 删除和创建表

首先使用以下 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 aswith bounds as (
select100 as origin_x,20 as origin_y,70 as width,50 as height)selectid,ST_Point(width * (random() - 0.5) + origin_x,height * (random() - 0.5) + origin_y,4326)::Geometry(Point,4326) as geom,concat(substring(md5((id%5000)::text),0,5),substring(md5(random()::text),0,5)) as pname
frombounds,generate_series(0,10000000) as id;
  1. 字符串再处理

为了便于观察,使用以下 SQL 语句对pname字段进行两次处理,分别在第五个字符和第九个字符处插入空格。

UPDATE random_points
SET pname = substring(pname, 1, 4) || ' ' || substring(pname, 5);
UPDATE random_points
SET pname = substring(pname, 1, 8) || ' ' || substring(pname, 9);
  1. 创建索引

pname字段创建 GIST 类型索引,耗时 960s,索引类型为gist_trgm_ops,以支持关键字查询的相似性匹配。

CREATE INDEX random_points_pname_idx ON random_points USING GIST (pname gist_trgm_ops);

geom字段创建 GIST 类型索引,耗时 390s,以提高空间查询效率。

CREATE INDEX random_points_geom_idx ON random_points USING GIST ( geom );
  1. 空间查询和关键字查询组合

构建一个多边形,使用以下 SQL 语句将其命名为poly

with poly as (SELECT ST_MakePolygon( ST_GeomFromText('LINESTRING(120 30,120 31,121 31,121 29,120 30)',4326)) as geom)

进行嵌套查询,先从random_points表和poly中筛选出位于多边形内的记录,然后对结果按照与关键字的相似性进行降序排序,并取前 10 条记录。

SELECT t.*,similarity(pname, 'abc') as siml  FROM (select r.* from random_points r,poly where st_contains(poly.geom,r.geom)) t
ORDER BY siml desc limit 10;

查询结果 总耗时 0.001s

idgeompnamesiml
8408214POINT (120.83824589907863 30.062078059390522)89d4 614 abc32c0.1764706
7316546POINT (120.0774601303543 30.20134481329915)aff0 ab5 ab61270.13333334
9040632POINT (120.98812953740612 29.460764651496056)abd8 a0c aa3a0b0.125
6579227POINT (120.09593195010038 30.250940353799365)aafd abe c8de080.11764706
5863486POINT (120.3497148509021 29.8889356761509)ab4f 4c4 422f810.11764706
734406POINT (120.87540667125438 29.98574429934731)ae87 ab0 2d671f0.11764706
5194425POINT (120.24255897006032 30.198223695596553)a4d4 318 abaadd0.11764706
3552394POINT (120.44942020766044 30.368667344833504)d092 d8b ab48a10.11764706
4769559POINT (120.85389792822224 30.749234346861414)a5b9 455 abbfd40.11764706
941308POINT (120.07061196111543 30.654686270683023)a087 11e ab57020.11764706

仔细一点:

在这里插入图片描述

四、测试结论

在给定的计算机配置下,通过合理的表结构设计、字符串处理、索引创建以及查询策略,可以较为高效地对千万级空间数据进行空间查询和关键字查询。创建表、更新字符串和创建索引的过程相对耗时较长,但一旦索引创建完成,实际查询操作非常迅速。这表明在处理大规模空间数据时,提前进行索引创建和优化是非常关键的。同时,也验证了 PostGIS 在处理复杂空间查询和关键字查询方面的强大能力。

五、完整SQL

--计算机配置:
----■内存(16G):----------------------------------
----内存1名称    3200 MHz
----大小    8 GB
----频率    3200 MHz
----数据宽度    64
----内存2名称    3200 MHz
----大小    8 GB
----频率    3200 MHz
----数据宽度    64
----■CPU(AMD 6核4600Hz):
----CPU名称    超微半导体 AMD Ryzen 5 4600H with Radeon Graphics 六核
----CPU温度    69°C
----厂商    超微半导体
----核心数    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
----大小    512 GB
----主硬盘    是
----序列号    00A0_7501_2A3B_3DE6.--删除表
drop table if exists random_points;
--创建表,2千万条数据
--生成的数据范围假定在经度100-170,纬度在20-70之间,4326坐标系
--pname字段存储属性信息,为了更符合一般兴趣点的规则,也就是前半段可能相同,所以该字段的前半部分每2000个相同
----前半部分:md5((id%5000)::text))
----后半部分:md5(random()::text))
--耗时90s
create table random_points aswith bounds as (
select100 as origin_x,20 as origin_y,70 as width,50 as height)selectid,ST_Point(width * (random() - 0.5) + origin_x,height * (random() - 0.5) + origin_y,4326)::Geometry(Point,4326) as geom,concat(substring(md5((id%5000)::text),0,5),' ',substring(md5(random()::text),0,5)) as pname
frombounds,generate_series(0,10000000) as id;UPDATE random_points
SET pname = substring(pname, 1, 4) || ' ' || substring(pname, 5);
UPDATE random_points
SET pname = substring(pname, 1, 8) || ' ' || substring(pname, 9);--创建属性字段pname的GIST类型索引,耗时960s        
CREATE INDEX random_points_pname_idx ON random_points USING GIST (pname gist_trgm_ops);
--创建空间字段geom的GIST类型索引,耗时390s
CREATE INDEX random_points_geom_idx ON random_points USING GIST ( geom );--构建一个多边形
--查询包含在多边形中,并满足关键字[abc]要求的前10条记录
--总耗时 0.001s
with poly as (SELECT ST_MakePolygon( ST_GeomFromText('LINESTRING(120 30,120 31,121 31,121 29,120 30)',4326)) as geom)
SELECT t.*,similarity(pname , 'abc') as siml  FROM (select r.* from random_points r,poly where st_contains(poly.geom,r.geom)) t
ORDER BY siml desc limit 10;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/427742.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

声网SDK脚本运行错误

文章目录 运行步骤无法运行.bat电脑出现警告--更改执行策略若无出现-更新power shell搜索最新版本的 PowerShell安装新版本 仍无法解决-手动下载第三方库 2024-9-9运行步骤 无法运行.bat 电脑出现警告–更改执行策略 若无出现-更新power shell 搜索最新版本的 PowerShell 在…

记录|如何对批量型的pictureBox组件进行批量Image设置

目录 前言一、问题表述二、批量化处理更新时间 前言 参考文章: 一、问题表述 问题就是上图所示,这些的命名风格统一,只是最后的数字是不同的。所以存在可以批量化进行处理的可能性。 二、批量化处理 private void SetPictureBoxImages(){for…

ElementPlus表单验证报错 formEl.validate is not a function

出现问题的代码 <!-- 密码重置弹框 --><el-dialog v-model"innerVisible" width"500" title"密码重置" append-to-body><el-form ref"ruleFormRef" style"max-width: 600px" :model"passForm" sta…

HarmonyOS元服务与卡片

元服务与卡片 文章目录 一、元服务1.介绍2.常见元服务项目步骤 二、卡片1.介绍2.卡片的创建3.卡片的数据的变更4.卡片的进程间通讯4.1使用工具包4.2使用步骤 5.卡片路由postCardAction&#xff1a;快速拉起后台5.1格式5.2快速拉起指定页面--router5.3调用后台功能--call5.3卡片…

委托的注册和注销

让我们来回顾一下委托的内容。 委托 是一种复杂的数据类型&#xff0c;需要我们先定义出来。当定义好类型后&#xff0c;声明委托变量来使用。 可以装载方法&#xff0c;只可以装载具有相同返回类型和参数列表的方法。 委托变量名&#xff08;参数列表&#xff09;&#xf…

使用Webpack创建vue脚手架并搭建路由---详解

1.使用 vue 库 vue 是一个非常好用的 javascript 库&#xff0c;现在已经发行了 vue 3&#xff0c;我们可以直接导入使用库文件&#xff0c;也可以使用单文件&#xff08;SFC&#xff09;的形式&#xff0c;直接使用库文件会简单一点&#xff0c;我们先来试一下吧。 1.1安装 v…

Qt 模型视图(二):模型类QAbstractItemModel

文章目录 Qt 模型视图(二)&#xff1a;模型类QAbstractItemModel1.基本概念1.1.模型的基本结构1.2.模型索引1.3.行号和列号1.4.父项1.5.项的角色1.6.总结 Qt 模型视图(二)&#xff1a;模型类QAbstractItemModel ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模…

巡检管理系统软件:功能与逻辑的深度探索

在现代企业管理中&#xff0c;巡检管理系统软件扮演着至关重要的角色。巡检管理系统不仅能提升巡检工作的效率和准确性&#xff0c;还能为企业的整体运营提供有力支持。下面将从功能与逻辑两个方面对巡检管理系统软件进行深入分析。 一、巡检管理系统软件的功能 巡检计划制定 …

快速体验Linux发行版:DistroSea详解与操作指南

DistroSea 是一个功能强大的在线平台&#xff0c;允许用户在无需下载或安装的情况下&#xff0c;通过浏览器直接测试多种Linux和BSD发行版。该平台非常适合Linux爱好者、系统管理员和开发者&#xff0c;提供一个简便的方式来体验各种操作系统而无需影响本地设备。 为什么选择D…

CleanMyMac 5 for Mac 最新中文破解版下载 系统优化垃圾清理工具

今天给大家带来的是CleanMyMac最新款CleanMyMac 5&#xff0c;它是一个全面的Mac清理和维护工具&#xff0c;通过提供多项强大的功能&#xff0c;帮助用户简化日常维护任务&#xff0c;提升系统性能&#xff0c;同时保护个人隐私和安全。无论是新手还是经验丰富的Mac用户&#…

如何实现实时监控局域网计算机桌面?学会这5个妙招你就能搞定!

在现代企业环境中&#xff0c;实时监控局域网内的计算机桌面已成为确保工作效率、维护信息安全的重要手段。 无论是出于管理需求还是安全考虑&#xff0c;掌握这一技能对于IT管理员来说都至关重要。 本文将详细介绍五个妙招&#xff0c;帮助你轻松实现局域网内计算机桌面的实…

python 自动化测试接口

比如我们要测试接口&#xff1a;identity/chatRecords/pages 已在Postman中有&#xff0c;那我们就可以直接从里面复制出Python脚本 新建&#xff1a; pagerequest.py import requests import jsonurl "http://192.168.31.132:70/identity/chatRecords/pages"payl…

gin配置swagger文档

一、基本准备工作 1、安装依赖包 go get -u github.com/swaggo/swag/cmd/swag go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files2、在根目录上配置swagger的路由文件 //2.初始化路由router : initialize.Routers()// 配置swaggerdocs.SwaggerInfo…

【网络安全】-ssrf服务器请求伪造攻击-burp

SSRF攻击服务器请求伪造攻击 CSRF攻击跨站请求伪造攻击也称客户端请求伪造攻击 两种攻击最主要的区别是一个在服务器&#xff0c;一个在客户端。 文章目录 前言 什么是SSRF攻击? 1.分类&#xff1a; 针对服务器的 SSRF 攻击&#xff1a; 针对后端系统的SSRF攻击&#xff1a; …

一篇文章解决ComfyUI常见的故障报错!

前言 学习和使用ComfyUI最痛苦的是什么&#xff1f;就是这满屏的红色方框和和[报错信息] “报错信息”)&#xff0c;处理完一批又一批&#xff0c;很多人玩了一两个流程就搞不下去了&#xff0c;很多初学者因此就放弃了。 有道是&#xff1a;配置流程大半天&#xff0c;跑通出…

【Python机器学习】NLP信息提取——值得提取的信息

目录 提取GPS信息 提取日期 如下一些关键的定量信息值得“手写”正则表达式&#xff1a; GPS位置&#xff1b;日期&#xff1b;价格&#xff1b;数字。 和上述可以通过正则表达式轻松捕获的信息相比&#xff0c;其他一些重要的自然语言信息需要更复杂的模式&#xff1a; 问…

【win工具】win安装flameshot并设置截图快捷键

1.下载flameshot软件2.windows端配置flameshot快捷键3.取消win自带截图快捷键 1.下载flameshot软件 https://flameshot.org/#download installer版本为安装包 portable版本为免安装版 2.windows端配置flameshot快捷键 https://cloud.tencent.com/developer/article/2114952 W…

Linux 防火墙:iptables (二)

文章目录 SNAT 原理与应用SNAT 应用环境SNAT 原理SNAT 转换前提条件SNAT 格式SNAT 转换规则配置 DNAT 原理与应用DNAT 应用环境DNAT 原理DNAT 转换前提条件DNAT 格式DNAT 转换规则配置 iptables 规则的备份和还原导出&#xff08;备份&#xff09;所有表的规则导入&#xff08;…

电脑USB端口禁止软件有哪些?什么软件能指定USB端口禁用?分享四款好用软件!

想象一下&#xff0c;你正准备在办公桌上插入U盘&#xff0c;打算快速拷贝文件&#xff0c;突然系统蹦出一个警告&#xff1a;“这个USB端口已被禁用&#xff01;” 是不是感觉好像被一双隐形的手制止了&#xff1f; 其实&#xff0c;这双“隐形的手”就是专门为企业安全设计…

redis群集三种模式:主从复制、哨兵、集群

redis群集有三种模式 redis群集有三种模式&#xff0c;分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cluster群集 ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制…