【问题标题】:PostgreSQL - PostGIS query optimizationPostgreSQL - PostGIS 查询优化
【发布时间】:2014-11-10 07:59:41
【问题描述】:

我有一个查询,它创建了pgRoutingpgr_drivingDistance 函数的输入:

CREATE TEMP TABLE tmp_edge AS                   
SELECT 
    e."Id" as id,
    e."Source" as source,
    e."Target" as target,
    e."Length" / (1000*LEAST("Speed", "SpeedMin")/60) as cost
FROM    "Edge" e,
        "SpeedLimit" sl
WHERE   sl."VehicleKindId" = 1
        AND e.the_geom && 
            ST_MakeEnvelope(
                x1-(1000*GREATEST("Speed", "SpeedMax")/60)*13, 
                y1-(1000*GREATEST("Speed", "SpeedMax")/60)*13, 
                x1+(1000*GREATEST("Speed", "SpeedMax")/60)*13,
                y1+(1000*GREATEST("Speed", "SpeedMax")/60)*13, 3857)
        AND sl."RoadCategoryId" = e."CategoryId";

WHERE 子句中,我多次计算同一事物以获得边界框坐标。

我尝试将计算放入FROM 部分并为计算列使用别名,但整个执行时间增加了两倍。

Edge 表很大(100 万),SpeedLimit 是几十条记录。

有什么方法可以增强这个查询吗?

【问题讨论】:

  • x1, y1 在这个查询中来自哪里。解释说明了什么?

标签: postgresql optimization postgis pgrouting


【解决方案1】:

建议使用JOIN 语法连接表。然后用WHERE 限制给定的集合。 ST_MakeEnvelope 是什么?您可以在 PostgreSQL 中使用表达式索引;)
Expression indexes in PostgreSQL

由于您正在使用表达式,您可能会从中受益。
您可能会使用Explain analyize 来注意查询中的瓶颈

【讨论】:

  • 我读到使用JOIN 加入时没有性能提升。 ST_MarkeEnvelope 是 PostGIS 函数,用于创建特定范围的矩形。用于连接的列已编入索引。
  • 我说的是表达式索引,因为您的查询中有一些表达式。 JOIN 增加了查询的清晰度。 :)
猜你喜欢
  • 2015-09-17
  • 1970-01-01
  • 2013-02-18
  • 2014-06-13
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
相关资源
最近更新 更多