为什么我的 postgis 不在几何字段上使用索引?

2024-05-16

Windows 上的 postgresql 9.5 + postgis 2.2。 我首先创建一个表:

CREATE TABLE points (
  id   SERIAL,
  ad   CHAR(40),
  name VARCHAR(200)
);

然后,添加一个几何字段“geom”:

select addgeometrycolumn('points', 'geom', 4326, 'POINT', 2);

并在其上创建要点索引:

CREATE INDEX points_index_geom ON points USING GIST (geom);

然后,我在表中插入大约 1,000,000 个点。

我想查询距给定点给定距离内的所有点。 这是我的sql代码:

SELECT st_astext(geom) as location FROM points
WHERE st_distance_sphere(
     st_geomfromtext('POINT(121.33 31.55)', 4326),
     geom) < 6000;

结果是我想要的,但是太慢了。 当我explain analyze verbose在这段代码中,我发现它没有使用points_index_geom(解释显示seq扫描并且没有索引)。

所以我想知道为什么它不使用索引,我应该如何改进?


你不能期望ST_Distance_Sphere()对此查询使用索引。你正在对geom字段的内容进行计算,然后对计算结果进行比较。在这种情况下,数据库可能不会使用索引,除非您有一个函数索引,其计算与查询中的计算几乎相同。

查找距某个点给定距离内的位置的正确方法是使用ST_DWithin http://postgis.net/docs/ST_DWithin.html

ST_DWithin — 如果几何图形在指定范围内,则返回 true 彼此的距离。因为几何单位是空间单位 参考和地理单位以米为单位,测量为 默认为 use_spheroid=true (围绕球体测量),以便更快 检查,use_spheroid=false 沿球体测量。

and

该函数调用将自动包含一个边界框 比较将利用任何可用的索引 几何形状。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 postgis 不在几何字段上使用索引? 的相关文章

  • 如何在 Elixir 的 Ecto 查询中使用“case-when”?

    我有一个 SQL 查询 例如 SELECT SUM CASE WHEN
  • PDO 从 Postgres 获取小数秒

    当我查询日期时间字段时postgresql 9 6 用一个简单的 pdo 语句 PHP7 sql SELECT date FROM table stmt adapter gt createStatement sql stmt gt prep
  • Hibernate 使用大量线程

    在我的独立应用程序中 一次性生成超过 1000 个线程 每个线程都有自己的 Hibernate 会话 但在这种情况下 会话计数超过数据库最大连接限制 从而引发错误 我尝试过设置 getCurrentSession 代替 openSessio
  • 无法使用wix工具集创建postgresql数据库

    我正在尝试使用 Wix ToolSet 在 PostgreSQL 中创建数据库 但总是收到错误 错误 2147467259 无法创建 SQL 数据库 pontow 错误详细信息 未知错误 当我尝试创建数据库或错误 无法连接到 SQL 数据库
  • PostgreSQL 自定义异常条件

    当我提出异常时是否可以创建自定义条件 考虑以下示例 BEGIN y x 0 EXCEPTION WHEN division by zero THEN RAISE NOTICE caught division by zero RETURN x
  • psycopg2 - 无密钥连接

    我正在尝试通过以下方式同时将项目插入到 postgres 表中ThreadedConnectionPool 但我不断得到psycopg2 pool PoolError trying to put unkeyed connection 不知道
  • 如何仅选择数组中的第一列并对其求和?

    这是我的代码 import numpy as np contrainte1 1080 0 65 minutes tous les jours contrainte2 720 0 55 minutes du lundi au vendredi
  • 如何复制具有 MySQL 中保留的键和其他结构特征的表?

    如何复制保留键和其他结构特征的表 包括主键 外键和索引 这可以通过单个 MySQL 查询来完成吗 我正在使用 create table newtable as select 但此方法会使所有键和索引丢失 无法使用单个查询来从另一个表复制一个
  • Google App Engine Java:如何删除未使用的索引?

    如果我发现有关删除未使用的索引的信息 例如上传和管理Python应用程序 删除未使用的索引 http code google com appengine docs python tools uploadinganapp html Delet
  • Mongodb:$HINT 的性能影响

    我有一个使用复合索引并在 id 上排序的查询 复合索引在索引末尾有 id 它工作正常 直到我添加 gt我的查询的子句 IE 初始查询 db colletion find field1 blabla field2 blabla sort id
  • 如何禁用 PostgreSQL 的所有优化

    我正在研究查询优化 想知道每种优化对查询有多大帮助 上次 我得到了一个answer https stackoverflow com questions 22785064 how to disable enable different que
  • 如果不存在则插入表并在两种情况下返回 id

    我正在尝试编写一个复杂的查询POSTGRES 这个问题是那个问题的子查询 这是我的表 id 是主键并且自动递增 id appid name 1 2 abc 2 2 cde 在此表中 我想获取名称为 xyz 且 appid 2 的 id 如果
  • 强制 Liquibase 将 Blob 映射到 PostgreSQL 上的 BYTEA

    如何告诉 Liquibase 将 BLOB 数据类型映射到 PostgreSQL 上的 BYTEA 看来 Hibernate 人们已经接管并调整了该工具以满足他们的需求 https liquibase jira com browse COR
  • PostgreSQL UPDATE 子字符串替换

    我在测试数据库中有几行 其中值前面有美元符号 我想要UPDATE中的值name的行test1然而 当我将以下查询放在一起时 它清空了表中的六行数据name柱子 UPDATE test1 SET name overlay placing fr
  • 使用 postgres tablefunc crosstab() 返回空单个值

    我试图将空值合并到返回的列表中 这样 batch id test name test value 10 pH 4 7 10 Temp 154 11 pH 4 8 11 Temp 152 12 pH 4 5 13 Temp 155 14 pH
  • 让 django 不插入某些字段

    我有一个针对 postgresql 数据库表的 Django 模型 我希望 Django 在对象创建期间不要插入 field 3 作为 DB 应该填写的时间戳字段 class AbcModel model id models AutoFie
  • Postgres 创建一个带有外键数组的表

    我正在制作一个名为 routes 的表 我希望它能够包含航班列表 航班详情请参阅航班表 我希望 航班 是航班表中的外键 ID 数组 所以 我有这个代码 CREATE TABLE routes id SERIAL PRIMARY KEY fl
  • 如何在 Postgres 中将表从公共模式移动到其他模式

    Postgres 9 1 数据库包含公共模式中的表 yksus1 ykssu9 pgAdmin 显示了这些定义 如下面的代码所示 如何将这些表移至 Firma1 架构 Firma1 模式中的其他表具有对这些表主键的外键引用 对这些表的外键引
  • 如何按照最初给出的时区存储和显示日期?

    我有一台服务器正在从不同时区的客户端提供数据 数据源包含人物 他们的出生日期和其他事件日期 出于我们的目的 如果我们可以将日期存储为给我们的日期 那就很方便了 例如 如果客户位于加利福尼亚州 并且告诉我们该人的出生日期是 5 月 31 日
  • 如何使用diesel-rs选择色谱柱的子集?

    我现在花了几个小时的时间来查询表的可用列的子集以及在其中包含计算 我知道这不是在选择查询中执行计算的最佳方式 但现在 我只是在开发一个原型 它应该是可行的 我在用diesel rs作为后端实现中所有数据库操作的 ORM 数据将存储在 Pos

随机推荐