PostGIS学习教程十:空间索引

PostGIS学习教程十:空间索引

回想一下,空间索引是空间数据库的三个关键特性之一。空间索引使得使用空间数据库存储大型数据集成为可能。在没有空间索引的情况下,对要素的任何搜索都需要对数据库中的每条记录进行"顺序扫描"。索引通过将数据组织到搜索树中来加快搜索速度,搜索树可以快速遍历以查找特定记录。

空间索引是PostGIS的最大价值之一。在前面的示例中,构建空间连接需要对整个表进行相互比较。这样做的代价很高:连接两个各包含10000条记录的表(每个表都没有索引)将需要进行100000000次比较;如果使用空间索引,则比较次数可能低至20000次。
加载nyc_census_blocks表时,pgShapeLoader会自动创建名为nyc_census_blocks_geom_idx的空间索引。

为了演示空间索引对性能有多重要,让我们在没有空间索引的情况下搜索nyc_census_blocks表。

我们的第一步是删除索引:

DROP INDEX nyc_census_blocks_geom_idx;

在这里插入图片描述
注意:DROP INDEX语句从数据库系统中删除现有索引。有关更多信息,请参见PostgreSQL文档。

现在,查看pgAdmin查询窗口右下角的"计时表"并运行以下命令。我们的查询将搜索每个单独的人口普查块(census block),以查找宽街(Broad Street)那个记录。

SELECT blocks.blkid
FROM nyc_census_blocks blocks
JOIN nyc_subway_stations subways
ON ST_Contains(blocks.geom, subways.geom)
WHERE subways.name = 'Broad St';

在这里插入图片描述
nyc_census_blocks表非常小(只有几千条记录),因此即时没有索引,查询也非常快。

现在,重新添加空间索引并再次进行查询:

CREATE INDEX nyc_census_blocks_geom_idx
ON nyc_census_blocks
USING GIST (geom);

注意:USING GIST子句告诉PostgreSQL在构建索引时使用generic index structure(GIST-通用索引结构)。创建索引时,如果收到类似错误:ERROR:index row requires 11340 bytes,maximum size is 8911,则可能是因为没有添加USING GIST子句。
在这里插入图片描述
在我的测试计算机上,时间下降到11毫秒。表越大,索引查询的相对速度提高就越大。

文章目录

  • PostGIS学习教程十:空间索引
  • 一、空间索引是怎样工作的?
    • 二、纯索引查询
  • 三、分析(ANALYZE)
  • 四、清理(VACUUM)
  • 五、相关函数


一、空间索引是怎样工作的?

标准数据库索引基于某个列的值创建层次结构树。空间索引略有不同-它们不能索引几何要素本身,而是索引几何要素的边界框。
在这里插入图片描述
在上图中,与黄星相交的线串数是一条,即红线。但是与黄色框相交的要素的边界框是两个,红框和蓝框。

空间数据库回答"哪些直线与黄星相交"这一问题使用的方法是,首先使用空间索引(速度非常快)判断"哪些框与黄色框相交",然后仅对第一次返回的几何要素进行"哪些直线与黄星相交"的精确计算。

对于一个大的数据表来说,这种先计算出近似结果,然后进行精确测试的"两遍"机制可以从根本上减少计算量。(这种思想就是粗调和精调的思想,就像显微镜一样有粗粒度的调整和细粒度的调整。很多事物都涉及到这个思想,它的作用就是减少了耗费的代价)

PostGIS和Oracle Spatial都具有相同的"R-Tree"空间索引结构。R-Tree将数据分解为矩形(rectangle)、子矩形(sub-rectangle)和子-子矩形(sub-sub rectangle)等。它是一种可自动处理可变数据的密度和对象大小的自调优(self-tuning)索引结构。
在这里插入图片描述

二、纯索引查询

PostGIS中最常用的函数(ST_Contains、ST_Intersects、ST_DWithin等)都包含自动索引过滤器。但有些函数(如ST_Relate)不包括索引过滤器。

要使用索引执行边界框搜索(即纯索引查询-Index only Query-没有过滤器),需要使用"&&“运算符。对于几何图形,&&运算符表示"边界框重叠或接触”(纯索引查询),就像对于数字,"=“运算符表示"值相同”。

让我们将对"West Village"社区人口的纯空间索引查询与更精确的查询进行比较。使用&&操作符的纯索引查询如下所示:

SELECT Sum(popn_total)
FROM nyc_neighborhoods neighborhoods
JOIN nyc_census_blocks blocks
ON neighborhoods.geom && blocks.geom
WHERE neighborhoods.name = 'West Village';

在这里插入图片描述
现在,让我们使用更精确的ST_Intersects函数执行相同的查询:

SELECT Sum(popn_total)
FROM nyc_neighborhoods neighborhoods
JOIN nyc_census_blocks blocks
ON ST_Intersects(neighborhoods.geom, blocks.geom)
WHERE neighborhoods.name = 'West Village';

在这里插入图片描述
结果数量低得多!第一个查询汇总与社区(neighborhood)关于边界框相交的每个人口统计块(census block);第二个查询仅汇总了与该社区几何图形本身严格相交的人口统计块。

三、分析(ANALYZE)

PostgreSQL查询规划器(query planner)智能地选择何时使用或不使用空间索引来计算查询。与直觉相反,执行空间索引搜索并不总是更快:如果搜索将返回表中的每条记录,则遍历索引树以获取每条记录实际上比从一开始线性读取整个表要慢(注意这句话)。

为了弄清楚要处理的数据的大概内容(读取表的一小部分信息,而不是读取表的大部分信息),PostgreSQL保存每个索引列中数据分布的统计信息。默认情况下,PostgreSQL定期收集统计信息。但是,如果你在短时间内更改了表的构成,则统计数据将不会是最新的。

为确保统计信息与表内容匹配,明智的做法是在表中加载和删除大容量数据后手动运行ANALYZE命令。这将强制统计系统收集所有索引列的统计信息。

ANALYZE命令要求PostgreSQL遍历该表并更新用于查询操作而估算的内部统计信息。

ANALYZE nyc_census_blocks;

四、清理(VACUUM)

值得强调的是,仅仅创建空间索引不足以让PostgreSQL有效地使用它。每当创建新索引或对表大量更新、插入或删除后,都必须执行清理(VACUUMing)。VACUUM命令要求PostgreSQL回收表页面中因记录的更新或删除而留下的任何未使用的空间。

清理对于数据库的高效运行非常关键,因此,PostgreSQL提供了一个“自动清理(autovacuum)"选项。

默认情况下,自动清理机制会根据活动级别确定的合理时间间隔自动清理(恢复空间)和分析(更新统计信息)。虽然这对于高度事务性的数据库是必不可少的功能,但在添加索引或大容量数据之后等待自动清理运行是不明智的,如果执行大批量更新,则应该手动运行VACUUM命令。

根据需要,可以单独执行清理和分析。发出VACUUM命令不会更新数据库统计信息;同样,执行ANALYZE命令也不会清理未使用的表空间。这两个命令都可以针对整个数据库、单个表或单个列运行。

VACUUM ANALYZE nyc_census_blocks;

五、相关函数

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI生成视频-Pika

背景介绍 Pika 是一个使用 AI 生成和编辑视频的平台。它致力于通过 AI 技术使视频制作变得简单和无障碍。 Pika 1.0 是 Pika 的一个重大产品升级,包含了一个新的 AI 模型,可以在各种风格下生成和编辑视频,如 3D 动画,动漫,卡通和电影风格。…

HTTP会话技术---Cookie、Session和Token介绍及它们在JavaWeb中的使用

当涉及到Web应用程序的身份验证和状态管理时,我们通常会使用到Cookie、Session和Token这些会话技术。下面是对它们的介绍,并在JavaWeb中的示例 Cookie(HTTP Cookie) Cookie是一种存储在用户浏览器中的小型文本文件,由…

Elasticsearch:什么是情感分析?

情感分析的定义 情感分析应用自然语言处理(NLP)、计算语言学和机器学习来识别数字文本的情感基调。 这使得组织能够识别对其品牌、产品、服务或想法的积极、中立或消极情绪。 最终,它使企业能够更好地了解客户,从而为企业提供可行…

题目:区间更新(蓝桥OJ 3291)

题目描述&#xff1a; 解题思路&#xff1a; 差分模板题。 题解&#xff1a; #include<bits/stdc.h> using namespace std;const int N 1e5 10; int a[N], diff[N] ;//数组的大小不可能开到大于1e9int res(int n, int m) {for(int i 1; i < n; i)cin >&g…

Linux使用root用户安装完MySQL软件后,配置MySQL这个普通用户登录

在 Linux 系统中&#xff0c;当您使用 root 用户安装 MySQL 后&#xff0c;系统会自动创建一个名为 mysql 的系统用户。这个 mysql 用户主要用于管理 MySQL 服务的运行&#xff0c;通常是没有登录系统的权限的。如果您希望使这个 mysql 用户能够登录到系统&#xff0c;您需要设…

GPC-虚拟主平台(VPP)概述

VPP: Virtual Primary Platform 虚拟主平台 2021年12月&#xff0c;GP发布了VPP 2.0。 随着安全芯片生态系统的发展&#xff0c;集成已成为一个显著的趋势。为了支持这一点&#xff0c;GP已经定义了虚拟主平台&#xff08;VPP&#xff09; 规范集概述并标准化了新的SE形式因素…

解决HTTP错误500.19 - internal server error -内部服务器错误的终极指南

在开发和维护网络应用程序时&#xff0c;难免会遇到各种HTTP错误代码。其中&#xff0c;HTTP错误500.19 - 内部服务器错误可谓是最令人头痛的问题之一。当你的应用程序遇到这个错误时&#xff0c;它似乎就像一道墙壁&#xff0c;挡住了你前进的道路。但别担心&#xff0c;本篇技…

极兔快递查询,极兔快递单号查询,将其中的退回件筛选出来

批量查询极兔快递单号的物流信息&#xff0c;将其中的退回件筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 极兔快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左上角的…

Python OS模块常用方法整理

os模块包含了普遍的操作系统和文件目录方法 引入类库 首先需要引入类库 import os 常用方法 OS模块方法 获取操作系统类型 nt->window:Microsoft Windows NT posix->Linux/Mac OS: Portable Operating System Interface of UNIX&#xff08;可移植操作系统接口&…

Unity中动态合批

文章目录 前言一、动态合批的规则1、材质相同是合批的前提&#xff0c;但是如果是材质实例的话&#xff0c;则一样无法合批。2、支持不同网格的合批3、动态合批需要网格支持的顶点条件二、我们导入一个模型并且制作一个Shader&#xff0c;来测试动态合批1、我们选择模型的 Mesh…

二叉树进阶经典笔试题_1

1. 二叉树创建字符串 题目链接&#xff1a;606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a;给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构…

C语言分支结构程序之if语句(1)

目录 if语句其一 奇数的判定 if语句其二 对奇数偶数的判断 if语句的结构图 专题 语法结构 结构图的阅读方法 结构图示例 相等运算符 关系运算符 嵌套的if语句 if语句其一 大家的一天都会怎么度过呢&#xff1f;我想应该不会是被设计好的程序那样循规蹈矩&#xff0c;我们…

字符集——带你了解UTF-8的前世今生

文章目录 字符集的来历汉字和字母的编码特点Unicode字符集字符集小结编码和解码开发约定 字符集的来历 计算机是美国人发明的&#xff0c;由于计算机能够处理的数据只能是0和1组成的二进制数据&#xff0c;为了让计算机能够处理字符&#xff0c;于是美国人就把他们会用到的每一…

关于 Kubernetes中Admission Controllers(准入控制器) 认知的一些笔记

写在前面 工作中遇到&#xff0c;简单整理记忆博文为官方文档整理涉及内置准入控制的分类理解理解不足小伙伴帮忙指正 人活着就是为了忍受摧残&#xff0c;一直到死&#xff0c;想明了这一点&#xff0c;一切事情都能泰然处之 —— 王小波《黄金时代》 为什么需要准入控制器 准…

【Qt开发流程】之对象模型2:属性系统

描述 Qt提供了一个复杂的属性系统&#xff0c;类似于一些编译器供应商提供的属性系统。然而&#xff0c;作为一个独立于编译器和平台的库&#xff0c;Qt不依赖于非标准的编译器特性&#xff0c;如__property或[property]。 Qt解决方案适用于Qt支持的所有平台上的任何标准c编译…

高性能网络编程 - 白话TCP 三次握手过程

文章目录 概述TCP协议头的格式TCP Finite State Machine (FSM) 状态机三次握手如何在 Linux 系统中查看 TCP 状态 概述 每一个抽象层建立在低一层提供的服务上&#xff0c;并且为高一层提供服务。 我们需要知道 TCP在网络OSI的七层模型中的第四层——Transport层 -----------…

百度智能云正式上线Python SDK版本并全面开源

文章目录 前言一、SDK的优势二、千帆SDK&#xff1a;快速落地LLM应用三、如何快速上手千帆SDK3.1、SDK快速启动3.2. SDK进阶指引 3.3. 通过Langchain接入千帆SDK4、开源社区 前言 百度智能云千帆大模型平台再次升级&#xff01;在原有API基础上&#xff0c;百度智能云正式上线…

MicroPython标准库

MicroPython标准库 arraybinascii(二进制/ASCII转换)builtins – 内置函数和异常cmath – 复数的数学函数collections – 集合和容器类型errno – 系统错误代码gc – 控制垃圾收集器hashlib – 散列算法heapq – 堆队列算法io – 输入/输出流json – JSON 编码和解码math – 数…

周周爱学习之Redis重点总结

redis重点总结 在正常的业务流程中&#xff0c;用户发送请求&#xff0c;然后到缓存中查询数据。如果缓存中不存在数据的话&#xff0c;就会去数据库查询数据。数据库中有的话&#xff0c;就会更新缓存然后返回数据&#xff0c;数据库中也没有的话就会给用户返回一个空。 1.缓…

【6】PyQt信号和槽

1. 信号和槽简介 信号和槽机制是 QT 的核心机制&#xff0c;应用于对象之间的通信 信号和槽是用来在对象间传递数据的方法当一个特定事件发生的时候&#xff0c;signal会被emit出来&#xff0c;slot调用是用来响应相应的signal的Qt中对象已经包含了许多预定义的 signal&#…