【问题标题】:Combining traditional and spatial indices in Postgres在 Postgres 中结合传统和空间索引
【发布时间】:2016-05-09 20:42:33
【问题描述】:

我有带时间戳的位置数据。

我希望 Postgres 能够有效地执行有时间和空间限制的查询。例如

select * 
from tracking_tags
where ts >= '1990-01-01T00:00:00.000Z'
and ts < '2000-01-01T00:00:00.000Z'
and lat > 40.0
and lat < 50.0
and long < 0.0
and long > -10.0

从索引的角度我应该如何处理这个问题?

我很困惑,因为我认为我可能需要在ts 上的普通 b 树索引和lat/long POINTs 上的 GIST 索引之间进行选择,但我需要一个复合索引(或者可能二)。

假设十年的数据,每天有一千条记录。

(P.S. 为废话 SQL 道歉,我还没有从 MySQL 切换到 Postgres - 但这个 Postgres 问题。)

【问题讨论】:

  • 这不是 postgis 查询。您只是在比较小数,这里没有任何几何或地理字段。

标签: postgresql gis


【解决方案1】:

此特定表架构的索引可能会有很大差异,具体取决于您需要获取哪些信息。

例如,下面的查询可能会有效地使用索引

CREATE INDEX ON tracking_tags USING gist (point(lat,long), ts);

SELECT * 
FROM tracking_tags
WHERE point(lat,long) <@ box(point(40,-10),point(50,0)) AND
      ts <@ tstzrange'[1990-01-01,2000-01-01)' AND
      lat NOT IN (40, 50) AND long NOT IN (-10, 0);

【讨论】:

  • “lat/long NOT IN...”有什么作用?为什么除了“
  • @chrisdew 运算符 point &lt;@ box 在 gist 索引中进行了优化,但它具有包容性。您的示例查询需要独占,因此首先使用快速索引的包含方法,然后过滤掉任何实际接触框框的点。
【解决方案2】:

btree_gist 扩展允许您在时间戳上创建一个要点索引,从而可以将它们与 PostGIS 索引结合起来。 PostgreSQL 也可以在一个查询中use multiple indexes。您必须进行测试,看看哪种组合表现最好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2012-11-03
    • 2012-09-23
    相关资源
    最近更新 更多