PostgreSQL/PostGIS中提升空间查询(分析)性能(效率)的一些方法

news2024/12/12 20:50:46

目录

1. 使用适当的索引

1.1 索引类型

1.2 分析查询计划

1.3 覆盖索引

1.4 复合索引

1.5 维护索引

1.6 删除不必要的索引

1.7 使用适当的数据类型

2. 建立分区表

2.1 分区表的基本概念

2.2 创建分区表的步骤

2.3 空间数据的分区

2.4 分区表优点

3. 简化几何形状

4. 使用适当的几何类型

5. 避免不必要的计算

6. 使用空间索引的统计信息

7. 使用并行查询

8. 使用适当的查询策略

9. 缓存热点数据

10. 优化数据库配置参数

10.1 内存相关参数

10.2 并行查询参数

10.3 索引和缓存参数

10.4 日志和检查点参数

10.5  其他与空间查询相关的参数

10.6  总结

       优化PostGIS中的空间查询性能是一个重要的任务,特别是在处理大型空间数据集时,可能会使查询效率变得低下。以下从各个方面总结了一些常见的方法来提升超大型数据集查询效率:

1. 使用适当的索引

        PostGIS支持多种类型的索引,包括GiST(Generalized Search Tree)、SP-GiST(Space-Partitioned Generalized Search Tree)和BRIN(Block Range INdexes)。对于大多数空间查询,GiST索引通常是最有效的选择。

        通过对空间字段或属性字段建立空间索引,以增强查询效率:

CREATE INDEX idx_geom ON spatial_data USING GIST (geom);

1.1 索引类型

   根据查询模式选择合适的索引类型。常见的索引类型包括:

  • B-tree 索引:适用于等值查询、范围查询和排序操作。
  • Hash 索引:适用于等值查询。
  • GiST(Generalized Search Tree)索引:适用于空间数据和全文搜索。
  • SP-GiST(Space-Partitioned Generalized Search Tree)索引:适用于多维数据。

示例:创建 B-tree 索引

CREATE INDEX idx_column_name ON table_name(column_name);

1.2 分析查询计划

使用 EXPLAINEXPLAIN ANALYZE 命令查看查询计划,了解查询是否使用了空间索引以及如何使用索引。

示例:使用 EXPLAIN

EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';

 示例:使用 EXPLAIN ANALYZE

EXPLAIN ANALYZE SELECT * FROM table_name WHERE column_name = 'value';

1.3 覆盖索引

如果查询只需要从索引中获取数据,可以使用覆盖索引。覆盖索引包含所有查询所需的列,从而避免访问表数据。

示例:创建覆盖索引

CREATE INDEX idx_covering ON table_name(column1, column2);

1.4 复合索引

对于经常一起使用的多个列,可以创建复合索引。复合索引可以提高多列查询的性能。

示例:创建复合索引

CREATE INDEX idx_composite ON table_name(column1, column2);

1.5 维护索引

定期重建或重新组织索引,以保持其性能。大多数数据库系统提供了自动维护索引的功能,但在某些情况下,手动维护可能是必要的。

示例:重建索引(PostgreSQL)

REINDEX TABLE table_name;

1.6 删除不必要的索引

过多的索引会增加写操作的开销,因此应定期检查并删除不再需要的索引。

示例:删除索引

DROP INDEX idx_column_name;

1.7 使用适当的数据类型

确保列的数据类型与存储的数据匹配,这有助于优化索引的使用。例如,不要将整数存储为字符串。

2. 建立分区表

2.1 分区表的基本概念

        在PostgreSQL中,分区表(Partitioned Table)是一种将大表的数据分割成更小、更易管理的部分的技术。根据地理区域或其他合适的分区键将数据分割成多个子表,这样在查询时只需要扫描相关的分区。通过分区,可以提高查询性能、简化数据维护以及优化存储空间的使用。

  1. 父表(Parent Table):这是定义了分区策略的表,它本身不包含实际的数据,只包含元数据和分区信息。
  2. 子表(Child Tables):这些是实际存储数据的表,每个子表对应一个分区。
  3. 分区键(Partition Key):用于决定数据行应该存储在哪个分区的列或列的组合。
  4. 分区类型
    • 范围分区(Range Partitioning):根据某个列的值的范围来划分数据。例如,按日期范围进行分区。
    • 列表分区(List Partitioning):根据某个列的具体值列表来划分数据。例如,按国家代码进行分区。
    • 哈希分区(Hash Partitioning):使用哈希函数将数据均匀分布到多个分区中。

        在PostGIS中,使用分区表进行空间查询时,查询引擎会自动处理跨子表的查询。这意味着你不需要手动指定要查询的子表,PostgreSQL会根据查询条件自动选择适当的子表进行查询。假设你有一个输入的几何图形(例如一个多边形),并希望查询与该图层相交的所有图形。PostgreSQL会解析查询条件,并根据分区键和索引来优化查询。如果查询条件涉及多个子表的范围,PostgreSQL会自动识别并访问所有相关的子表。 

2.2 创建分区表的步骤

  1. 创建父表:定义表结构并指定分区策略。
  2. 创建子表:为每个分区创建实际存储数据的子表。
  3. 附加分区:将子表附加到父表上。

以下是一个简单的范围分区示例:

-- 创建父表
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_date DATE NOT NULL,
    customer_id INT NOT NULL,
    amount DECIMAL(10, 2) NOT NULL
) PARTITION BY RANGE (order_date);

-- 创建子表
CREATE TABLE orders_2022 PARTITION OF orders
FOR VALUES FROM ('2022-01-01') TO ('2023-01-01');

CREATE TABLE orders_2023 PARTITION OF orders
FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');

        在这个例子中,orders 是父表,orders_2022orders_2023 是子表。数据会根据 order_date 被自动分配到相应的子表中。

2.3 空间数据的分区

        要提升对大型空间数据的查询效率,首先需要确定一个合适的分区键。常见的分区键包括时间(如日期、年份)、地理区域(如行政区划代码、经纬度范围)等。选择分区键时,应考虑数据访问模式和查询需求。例如,如果大多数查询都是基于属性,比如时间范围的,那么可以选择时间作为分区键;如果查询主要是基于地理位置的,那么可以选择地理区域作为分区键

        基于地理位置的分区方法,通常用于将数据按照地理区域进行划分。这种策略在处理空间数据时非常有用,例如在GIS(地理信息系统)中。常见的分区方法包括四分法、网格法和行政区划法等。

        四分法:将整体区域划分为四个相等的部分。
        网格法:将区域划分为大小相等的网格单元。
        行政区划法:根据行政边界进行分区,如省、市、县等。

        标准分幅法:将区域按1:1万标准分幅或1:5万等标准分幅进行子表划分。

例如,以图形左下角坐标建立复合空间网格分区。使用PostgreSQL的复合分区(Composite Partitioning)功能根据多个列的值进行分区,步骤如下:

(1)创建主表并定义复合分区

首先,创建一个主表,并使用PARTITION BY RANGE来定义复合分区。这里我们将使用ST_XMin(geom)和ST_YMin(geom)作为分区键。

(2)创建子表并定义分区范围

接下来,创建四个子表,每个子表代表一个象限。这些子表将根据x最小值和y最小值的范围进行分区。

(3)添加空间索引

为每个子表添加空间索引,以提高查询性能。

--(1) 创建分区表
CREATE TABLE spatial_data (
    id SERIAL PRIMARY KEY,
    geom GEOMETRY(Point, 4326)
) PARTITION BY RANGE (ST_XMin(geom), ST_YMin(geom));

-- (2)创建四个子表,分别代表四个象限
CREATE TABLE spatial_data_q1 PARTITION OF spatial_data FOR VALUES FROM (-180, -90) TO (0, 0);
CREATE TABLE spatial_data_q2 PARTITION OF spatial_data FOR VALUES FROM (0, 0) TO (180, 90);
CREATE TABLE spatial_data_q3 PARTITION OF spatial_data FOR VALUES FROM (-180, 90) TO (0, 180);
CREATE TABLE spatial_data_q4 PARTITION OF spatial_data FOR VALUES FROM (0, 90) TO (180, 180);

-- (3)添加空间索引
CREATE INDEX spatial_data_q1_idx ON spatial_data_q1 USING GIST (geom);
CREATE INDEX spatial_data_q2_idx ON spatial_data_q2 USING GIST (geom);
CREATE INDEX spatial_data_q3_idx ON spatial_data_q3 USING GIST (geom);
CREATE INDEX spatial_data_q4_idx ON spatial_data_q4 USING GIST (geom);

        

2.4 分区表优点

  1. 提高查询性能:通过将空间数据按照特定的分区键(如地理区域或时间范围)进行分区,可以减少查询时需要扫描的数据量,从而加快查询速度。

  2. 简化数据维护:分区表使得对特定数据集的操作(如备份、恢复、删除等)更加简单高效。例如,如果只需要处理某个特定时间段或地理区域内的数据,可以直接操作对应的分区。

  3. 优化存储空间:可以针对不同类型的数据使用不同的存储策略,如压缩、加密等。分区表还可以帮助更有效地利用存储资源。不常用的历史数据可以被移动到成本较低的存储介质上,而当前活跃的数据则保留在高性能的存储上。

  4. 支持多种分区类型:PostgreSQL支持多种分区类型,包括范围分区、列表分区和哈希分区等。这些分区类型可以根据不同的业务需求和数据特性进行选择和应用。

        通过合理使用分区表,可以有效地管理和优化大型数据库系统的性能和可维护性。

注意事项

  1. 索引:需要为每个子表单独创建索引,因为索引不会自动继承。
  2. 约束:某些约束(如外键约束)可能需要在每个子表上单独定义。
  3. 维护成本:分区表的管理和维护可能比非分区表复杂一些,需要更多的规划和监控。

3. 简化几何形状

        在插入或更新数据时,尽量简化几何形状。例如,可以使用ST_Simplify函数来减少顶点数量,从而降低存储和计算的复杂度。

4. 使用适当的几何类型

        选择合适的几何类型可以减少存储需求和计算复杂度。例如,如果不需要三维坐标,可以使用GEOMETRY(Polygon, 4326)而不是GEOMETRY(PolyhedralSurface, 4326)

5. 避免不必要的计算

        在查询中尽量避免不必要的计算。例如,不要在WHERE子句中进行复杂的几何运算,而是尽可能提前计算好结果。

6. 使用空间索引的统计信息

        确保PostgreSQL有最新的统计信息,以便优化器能够生成高效的查询计划。你可以定期运行ANALYZE命令来更新统计信息。

ANALYZE spatial_data;

7. 使用并行查询

        如果你的硬件资源允许,可以利用PostgreSQL的并行查询功能来加速空间查询。确保你的PostgreSQL配置允许并行查询,并在查询中使用PARALLEL提示。

SET max_parallel_workers_per_gather = 4;
SELECT /*+ PARALLEL(spatial_data, 4) */ * FROM spatial_data WHERE ST_Intersects(geom, ST_GeomFromText('POLYGON((...))', 4326));

8. 使用适当的查询策略

        有时,调整查询策略也能显著提高性能。例如,使用ST_DWithin代替ST_Intersects,因为前者通常更快。

SELECT * FROM spatial_data WHERE ST_DWithin(geom, ST_GeomFromText('POINT(10 20)', 4326), 100);

9. 缓存热点数据

        如果你的数据访问模式具有明显的热点特性,可以考虑使用缓存机制来存储热点数据,以减少数据库的负载。

10. 优化数据库配置参数

        确保你的PostgreSQL和PostGIS配置已经过优化。例如,调整共享缓冲区大小、工作内存、并行数量等参数,以适应你的工作负载。

        提高PostGIS数据库空间查询效率的参数调整主要集中在以下几个方面:

10.1 内存相关参数

  • work_mem: 控制每个操作(如排序、哈希表等)可以使用的最大内存量。增加这个值可以提高复杂查询的性能,但要注意不要超过物理内存的限制。

ALTER SYSTEM SET work_mem = '64MB';
SELECT pg_reload_conf();
  • maintenance_work_mem: 控制维护操作(如VACUUM、CREATE INDEX等)可以使用的最大内存量。适当增加这个值可以加快这些操作的速度。

ALTER SYSTEM SET maintenance_work_mem = '512MB';
SELECT pg_reload_conf();

10.2 并行查询参数

  • max_parallel_workers_per_gather: 控制每个Gather节点可以使用的最大并行工作进程数。增加这个值可以提高并行查询的效率。

    ALTER SYSTEM SET max_parallel_workers_per_gather = 4;
    SELECT pg_reload_conf();
    

  • parallel_setup_cost: 设置启用并行查询的代价阈值。降低这个值可以使更多的查询自动使用并行执行。

ALTER SYSTEM SET parallel_setup_cost = 100;
SELECT pg_reload_conf();

10.3 索引和缓存参数

  • shared_buffers: 控制用于共享内存缓冲区的内存量。增加这个值可以提高缓存命中率,从而提高查询性能。

ALTER SYSTEM SET shared_buffers = '2GB';
SELECT pg_reload_conf();
  • effective_cache_size: 控制PostgreSQL认为操作系统缓存的大小。增加这个值可以帮助优化器更好地估计I/O成本。

ALTER SYSTEM SET effective_cache_size = '6GB';
SELECT pg_reload_conf();

10.4 日志和检查点参数

  • checkpoint_segments: 控制WAL日志文件的数量。增加这个值可以减少检查点的频率,从而减少I/O开销。
ALTER SYSTEM SET checkpoint_segments = 32;
SELECT pg_reload_conf();
  • wal_buffers: 控制WAL日志缓冲区的大小。增加这个值可以减少WAL日志写入的频率。
ALTER SYSTEM SET wal_buffers = '16MB';
SELECT pg_reload_conf();

10.5  其他与空间查询相关的参数

  • postgis.backend: 确保PostGIS扩展已正确加载并启用。
    --创建空间扩展
    CREATE EXTENSION postgis;
    

10.6  总结

        以下是一个综合示例,展示如何调整上述参数:

ALTER SYSTEM SET work_mem = '64MB';
ALTER SYSTEM SET maintenance_work_mem = '512MB';
ALTER SYSTEM SET max_parallel_workers_per_gather = 4;
ALTER SYSTEM SET parallel_setup_cost = 100;
ALTER SYSTEM SET shared_buffers = '2GB';
ALTER SYSTEM SET effective_cache_size = '6GB';
ALTER SYSTEM SET checkpoint_segments = 32;
ALTER SYSTEM SET wal_buffers = '16MB';
SELECT pg_reload_conf();

        查看这些参数现有值的方法:

        (1)SHOW 命令

SHOW work_mem;
SHOW maintenance_work_mem;
SHOW max_parallel_workers_per_gather;
SHOW parallel_setup_cost;
SHOW shared_buffers;
SHOW effective_cache_size;
SHOW checkpoint_segments;
SHOW wal_buffers;

        (2)查询 pg_settings 系统视图

-- 查看 work_mem 的当前值
SELECT name, setting
FROM pg_settings
WHERE name = 'work_mem';

-- 查看 maintenance_work_mem 的当前值
SELECT name, setting
FROM pg_settings
WHERE name = 'maintenance_work_mem';

-- 查看 max_parallel_workers_per_gather 的当前值
SELECT name, setting
FROM pg_settings
WHERE name = 'max_parallel_workers_per_gather';

-- 查看 parallel_setup_cost 的当前值
SELECT name, setting
FROM pg_settings
WHERE name = 'parallel_setup_cost';

-- 查看 shared_buffers 的当前值
SELECT name, setting
FROM pg_settings
WHERE name = 'shared_buffers';

-- 查看 effective_cache_size 的当前值
SELECT name, setting
FROM pg_settings
WHERE name = 'effective_cache_size';

-- 查看 checkpoint_segments 的当前值
SELECT name, setting
FROM pg_settings
WHERE name = 'checkpoint_segments';

-- 查看 wal_buffers 的当前值
SELECT name, setting
FROM pg_settings
WHERE name = 'wal_buffers';

        通过结合以上方法,你可以显著提高PostGIS中的空间查询性能。这些优化措施不仅适用于单个查询,还能在整个系统层面提升性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

让PPT不再“难搞”:智能工具如何改变办公体验

PPT的世界是一场属于设计感与逻辑力的双重较量。那些字体配色的小心思,排版设计的大考验,无不让人抓耳挠腮。然而,科技的加持让这一切正悄然改变。比如,随着 ai生成ppt 工具的兴起,许多复杂操作正被重新定义&#xff0…

大语言模型(LLM)与智能机器人的应用分析

系列文章目录 前言 近年来,大型语言模型(LLM)的集成彻底改变了机器人领域,使机器人能够以人类熟练程度进行交流、理解和推理。本文探讨了 LLM 对机器人的多方面影响,并针对在不同领域利用这些模型的关键挑战和机遇进行了研究。通过将 LLM 应用程序分类并分析核心机器人元素…

【论文速读】| AttackQA:利用微调及开源大语言模型辅助网络安全运营的数据集的开发与应用

基本信息 原文标题: AttackQA: Development and Adoption of a Dataset for Assisting Cybersecurity Operations Using Fine-Tuned and Open-Source LLMs 原文作者: Varun Badrinath Krishna 作者单位: SambaNova Systems 关键词: 网络安全、检索增强生成(RAG&…

Android 车载虚拟化底层技术-Kernel 5.10 -Android12(multi-cards)技术实现

详细代码实现见 Android Display Graphics系列文章-汇总​​​​​​Android Display Graphics系列文章-汇总 Android Display Graphics系列文章-汇总 Android Display Graphics系列文章-汇总 本文主要包括部分: 一、Android12的Kernel 5.10版本 1.1 Kernel 5…

lqb_算法

1.蓝桥杯2024年第十五届决赛真题- 蚂蚁开会 题目描述 二维平面上有 n 只蚂蚁,每只蚂蚁有一条线段作为活动范围,第 i 只蚂蚁的活动范围的两个端点为 (uix, uiy),(vix, viy)。现在蚂蚁们考虑在这些线段的交点处设置会议中心。为了尽可能节省经费&#xf…

【银河麒麟高级服务器操作系统】修改容器中journal服务日志存储位置无效—分析及解决方案

了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 服务器环境以及配置 【机型】 整机类型/架构&am…

springboot422甘肃旅游服务平台代码-(论文+源码)_kaic

摘 要 使用旧方法对甘肃旅游服务平台的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在甘肃旅游服务平台的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的…

决策曲线分析(DCA)中平均净阈值用于评价模型算法(R自定义函数)

决策曲线分析(DCA)中平均净阈值用于评价模型算法 DCA分析虽然不强调用来评价模型算法或者变量组合的优劣,但是实际应用过程中感觉DCA曲线的走势和模型的效能具有良好的一致性,其实这种一致性也可以找到内在的联系,比如…

短信验证码burp姿势

首先声明,本文仅仅作为学习使用,因个人原因导致的后果,皆有个人承担,本人没有任何责任。 在之前的burp学习中,我们学习了图片验证码的突破,但是现实中还有很多短信验证码,在此我介绍几种短信验…

机器学习:全面学习路径指南

摘要: 本文精心规划了一条从入门到精通机器学习的学习路线,详细涵盖了基础理论构建、核心技术栈掌握、主流算法学习、实践项目锻炼以及前沿领域探索等多个关键阶段。通过逐步深入各个层面,介绍必备的数学知识、编程工具、经典与现代机器学习算…

聚类及Python下实现 K-means 算法

聚类 聚类是无监督学习中的一种重要方法,旨在将数据集中相似的数据对象划分到同一个簇中,使得不同簇之间的数据对象差异尽可能大。在大数据环境下,聚类可以帮助挖掘数据中的隐藏结构和模式,应用场景十分广泛,比如在客…

【Qt在线安装器】不能下载Qt5

qt在线下载不显示以前的版本时: 勾选”Archive“,点击”筛选“ 然后就会显示出QT5的版本, 按流程下载即可

html|本地实现浏览器m3u8播放器,告别网络视频卡顿

前言 网络上经常是以m3u8文件传输视频流的 ,但是有时网络慢往往导致视频播放卡顿。于是我在想能不能先下载然后再播放呢?于是尝试下载然后实现本地播放m3u8视频。 正文 1.找到网络视频流的m3u8连接 一般在浏览器按F12就可以看到有请求视频流的连接。 …

[leetcode100] 101. 对称二叉树

https://leetcode.cn/problems/symmetric-tree/description/?envTypestudy-plan-v2&envIdtop-100-liked 心血来潮,突然感觉很久没做leetcode,刷一题。 看到“简单”,哦吼,应该很快吧。 结果真是《简单》 题目描述 给你一个…

技术速递|dotnet scaffold – .NET 的下一代内容创建

作者:Sayed Ibrahim Hashimi - 首席项目经理 排版:Alan Wang Visual Studio 中为 ASP.NET Core 项目搭建脚手架是一项长期特性,是在 ASP.NET Core 发布后不久添加的。多年来,我们一直支持从命令行搭建脚手架。根据从命令行操作中获…

经纬度解析到省市区【开源】

现在业务中有需要解析经纬度到省市区。 按理说可以直接使用高德,百度之类的。 但是老板太抠。于是去找开源项目。找了一圈,数据都太老了,而且有时候编码还不匹配。 所以诞生了这个项目,提供完整的一套省市区编码和定位反解析。…

打开分页机制

分页机制的表 一般线性地址和物理地址大小不会一样,物理内存空间不够时候,涉及和外部磁盘的swap过程,但是这个系统不涉及 CR3放的是页表的起始地址 代码部分 PDE:4MB page 一级页表的页块大小为4MB 然后是这个二级页表 PTE:4KB page 关于什…

EasyPlayer.js播放器如何在iOS上实现低延时直播?

随着流媒体技术的迅速发展,H5流媒体播放器已成为现代网络视频播放的重要工具。其中,EasyPlayer.js播放器作为一款功能强大的H5播放器,凭借其全面的协议支持、多种解码方式以及跨平台兼容性,赢得了广泛的关注和应用。 那么要在iOS上…

多模态大语言模型 MLLM 部署微调实践

1 MLLM 1.1 什么是 MLLM 多模态大语言模型(MultimodalLargeLanguageModel)是指能够处理和融合多种不同类型数据(如文本、图像、音频、视频等)的大型人工智能模型。这些模型通常基于深度学习技术,能够理解和生成多种模…

uniapp uni-table最简单固定表头

需求:固定表头数据,在网上找了半天,啥都有,就是一直实现不了,最后更改代码实现 1.效果 2.主要代码讲解完整代码 表格的父级一定要设置高度,不然会错位,我看网上说设置position:fixed…