目录
- 1、简介
- 2、空间连接
- 3、空间索引
- 3.1 索引操作
- 3.2 空间索引的工作原理
- 3.2.1 R-Tree
- 3.3 空间索引函数
- 3.4 仅索引查询
- 3.5 ANALYZE
- 3.6 VACUUMing
- 3.7 函数列表
- PS
1024到啦!!!
先祝各位程序员或者想成为程序员正在奋斗中的伙伴1024程序员节快乐~
我也是今年应届毕业成为了JavaCoder的一员哈,属于程序员小新秀,祝我们技术高涨,薪资高涨,头发不减!!!
1、简介
这篇文章紧接着上一篇的PostGis--空间(上)
还没看过朋友可以先看这两篇文章:
PostGIS–介绍
PostGis–空间(上)
PostGIS的空间连接和空间索引技术是高效处理地理数据的关键。空间连接利用ST_Intersects、ST_Contains等函数实现复杂的空间关系查询。空间索引,特别是R-Tree结构,大幅提升了大规模空间数据的查询效率。空间索引的创建、维护和优化方法,包括ANALYZE和VACUUM操作,为构建高性能地理信息系统提供了实用指南。这些技术的掌握对于优化空间数据库性能和进行复杂空间分析至关重要。
2、空间连接
任何在两个表之间提供真/假关系的函数都可用于驱动空间联接,但最常用的函数是:ST_Intersects
、ST_Contains
和 ST_DWithin
。
- ST_Contains(几何 A,几何 B):当且仅当 B 的点不在 A 的外部,并且 B 的内部至少有一个点位于 A 的内部时,返回 true。
- ST_DWithin(geometry A, geometry B, radius):如果几何体彼此之间的距离在指定的距离内,则返回 true。
- ST_Intersects(geometry A, geometry B):如果几何/地理“在空间上相交”,则返回 TRUE(共享空间的任何部分),如果它们不相交(它们不相交),则返回 FALSE。
- round(v numeric, s integer):四舍五入到小数点后 s 位的 PostgreSQL 数学函数
- strpos(string, substring):PostgreSQL 字符串函数,返回指定子字符串的整数位置。
- sum(expression):PostgreSQL 聚合函数,返回一组记录中的记录总和。
3、空间索引
空间索引是空间数据库的三个关键特征之一。索引使使用空间数据库作为大型数据集成为可能。如果没有索引,任何对要素的搜索都需要对数据库中的每条记录进行“顺序扫描”。索引通过将数据组织到搜索树中来加快搜索速度,该搜索树可以快速遍历以查找特定记录。
空间索引是PostGIS最大的资产之一。在前面的示例中,构建空间联接需要将整个表相互比较。这可能会变得非常昂贵:连接两个表,每个表有 10,000 条记录,而没有索引,需要 100,000,000 次比较;使用索引,成本可能低至 20,000 次比较。
3.1 索引操作
-- 删除索引
DROP INDEX nyc_census_blocks_geom_idx;
-- 创建索引
-- 该子句告诉 PostgreSQL 在构建索引时使用通用索引结构 (GIST)。
-- 如果在创建索引时收到类似此类的错误,则可能忽略了添加该子句。
-- USING GISTERROR: index row requires 11340 bytes, maximum size is 8191USING GIST
CREATE INDEX nyc_census_blocks_geom_idx
ON nyc_census_blocks
USING GIST (geom);
3.2 空间索引的工作原理
标准数据库索引根据要编制索引的列的值创建分层树。空间索引略有不同,它们无法对几何要素本身进行索引,而是对要素的边界框进行索引。
在上图中,与黄色星星相交的线数是一条,即红线。但是与黄色框相交的特征边界框
是两个,即红色和蓝色。
3.2.1 R-Tree
R树是B树向多维空间发展的另一种形式,它将对象空间按范围划分,每个结点都对应一个区域和一个磁盘页,非叶结点的磁盘页中存储其所有子结点的区域范围,非叶结点的 所有子结点的区域都落在它的区域范围之内;叶结点的磁盘页中存储其区域范围之内的所有空间对象的外接矩形。R树是一种动态索引结构。
3.3 空间索引函数
- ST_Intersects:
○ 判断两个几何图形是否相交。如果两个图形有任何共享点(包括边界和内部),此函数返回真(true)。 - ST_Contains:
○ 检查第一个几何图形是否完全包含第二个几何图形。如果第二个图形的所有点都在第一个图形的内部,返回真。 - ST_Within:
○ 检查第一个几何图形是否完全位于第二个几何图形内部。这是ST_Contains的逆操作。 - ST_DWithin:
○ 判断两个几何图形之间的距离是否在指定的距离之内。这对于找出“近”某个点或图形的其他点或图形特别有用。 - ST_ContainsProperly:
○ 类似于ST_Contains,但更严格。它返回真只在第一个几何完全包含第二个,并且二者不仅是接触边界。 - ST_CoveredBy:
○ 判断第一个几何图形是否被第二个几何图形覆盖。如果第一个图形的所有点都在第二个图形中,或者在其边界上,返回真。 - ST_Covers:
○ 检查第一个几何图形是否覆盖第二个几何图形。这是ST_CoveredBy的逆操作。 - ST_Overlaps:
○ 检查两个几何图形是否在两者都不被对方完全包含的情况下共享一些部分区域。 - ST_Crosses:
○ 判断两个几何图形是否在内部相交,但不完全包含对方。这通常用于不同维度的图形,例如线与多边形。 - ST_DFullyWithin:
○ 类似于ST_DWithin,但要求两个几何体之间的每个点的距离都必须在指定距离之内。 - ST_3DIntersects:
○ 在三维空间中检查两个几何体是否相交。 - ST_3DDWithin:
○ 在三维空间中,检查两个几何体之间的距离是否在指定的距离内。 - ST_3DDFullyWithin:
○ 在三维空间中,这是ST_DFullyWithin的一个版本,确保所有点的距离都在给定距离之内。 - ST_LineCrossingDirection:
○ 确定两条线的交叉方向。这个函数返回一个整数,表明线是如何相交的(比如从左到右,从右到左等)。 - ST_OrderingEquals:
○ 如果两个几何图形在空间中的点序列完全一致,则返回真。这常用于检查两个几何图形是否完全相同。 - ST_Equals:
○ 检查两个几何图形是否在空间上等同,忽略点的顺序。
3.4 仅索引查询
PostGIS 中大多数常用函数(ST_Contains、ST_Intersects、ST_DWithin 等)都自动包含索引过滤器。但某些函数(例如,ST_Relate)不包括索引筛选器。
要使用索引(不过滤)进行边界框搜索,请使用 && 运算符。对于几何图形,&&运算符表示“边界框重叠或接触”,就像对于数字,=运算符表示“值相同”。
3.5 ANALYZE
-- 用于收集有关指定表的统计信息,这里的表名为 nyc_census_blocks。
-- 这些统计信息主要用于优化查询计划器的决策过程,从而提高查询效率。
ANALYZE nyc_census_blocks;
作用
收集统计数据
优化查询性能
自动和手动触发
重要性
查询计划的准确性
处理数据倾斜
维护和自动化
在数据库维护中,ANALYZE 是一个重要的工具,它可以被集成到定期维护脚本中,
以自动化这一过程,确保数据库性能的持续优化。
总结来说,ANALYZE nyc_census_blocks; 是一个关键的数据库维护命令,
用于确保查询性能通过准确和及时的统计数据得到优化。
这对于维护查询响应时间和整体数据库性能至关重要。
3.6 VACUUMing
仅仅创建一个索引并不足以让PostgreSQL有效地使用它。每当对表发出大量 UPDATE、INSERT 或 DELETE 时,都必须执行 VACUUMing。该命令要求 PostgreSQL 回收表页中因更新或删除记录而留下的任何未使用空间。
VACUUM可以根据需要单独执行数据库的清空和分析。发出命令不会更新数据库统计信息;同样,发出命令也不会恢复未使用的表行。这两个命令都可以针对整个数据库、单个表或单个列运行。
VACUUM ANALYZE nyc_census_blocks;
- VACUUM:
○ 功能: VACUUM 操作用于回收数据库表中的空闲空间,这个空间是由于数据删除和更新操作留下的。这不仅有助于释放存储空间,还可以避免表内部碎片化,从而提高数据库查询的效率。
○ 细节: PostgreSQL 中的事务性特性意味着,当数据被删除或更新时,旧的数据版本并不会立即从物理存储中移除。这样做是为了支持并发控制和事务回滚。VACUUM 正是用来清理这些不再需要的数据版本的。 - ANALYZE:
○ 功能: ANALYZE 操作用于更新表的统计信息,这些信息对于数据库优化器(Planner/Optimizer)选择最佳执行计划至关重要。统计信息包括数据的分布情况、列值的频率等。
○ 细节: 数据库优化器使用这些统计信息来评估不同查询操作的成本,如何高效地执行查询(例如,决定使用哪种类型的索引,是否执行表连接等)。如果统计信息不准确,可能导致数据库选择了非最优的执行计划,影响查询性能。
3.7 函数列表
geometry_a && geometry_b
:如果 A 的边界框与 B 的边界框重叠,则返回 TRUE。
geometry_a = geometry_b
:如果 A 的边界框与 B 的边界框相同,则返回 TRUE。
ST_Intersects(geometry_a, geometry_b)
:如果几何/地理“在空间上相交”(共享空间的任何部分),则返回 TRUE,如果它们不相交(它们不相交),则返回 FALSE。
PS
大家好,我是小健,Java开发工程师一枚,我会持续发一些技术推文,偶尔也会发些工作求职,互联网热点的事情,希望各位小伙伴多多支持,如果觉得本篇文章对您有所帮助,记得点赞关注收藏喔~