使用 ST_Intersects 和 ST_MakePoint,不使用 SET_SRID

Using ST_Intersects with ST_MakePoint with no SET_SRID

我正在使用 WHERE ST_Intersects(ST_SetSRID(ST_MakePoint(, )::geography, 4326), geog)geography 字段中查找一个点(在示例查询中名为 geog)。

由于我不太明白的原因*,ST_SetSRID 有时会导致问题,将其从查询中删除会使这些问题消失。我想从查询中删除 ST_SetSRID,但找不到任何地方解释 SRID ST_Intersects 将使用什么。

geog 的 SRID 为 4326。ST_Intersects 会直接使用它还是假设没有坐标系并给我提供与使用 ST_SetSRID 时不同的结果?


* 如果你好奇这个问题与准备事务、nodejs 和最小连接池有关。对于池中 1 个最小连接,在 4-6 次查询之后,下一次查询将花费 15-30 秒(通常需要大约 100 毫秒)。对于 2 分钟的连接,在问题发生之前大约需要 8-10 个查询,对于 5 分钟,大约需要 25 个查询(依此类推)。我觉得我正在服用疯狂药丸。

ST_SetSRIDreturns一个geometry,不是一个geography。您通常不需要为 geography 设置 SRID,因为它假定默认值为 4326,所以我建议不要使用它(除非您有不同的椭圆体或其他东西)。 (但如果您使用 geometry,ST_SRID 是强制性的。

此外,ST_Intersects 隐式操作 geometrygeography 类型。根据您是否使用 ST_SetSRID,它会选择:

  • ST_Intersects(geometry, geometry);或
  • ST_Intersects(geography, geography)

您可以通过强制转换每个参数来明确选择其中一个运算符:

ST_Intersects(ST_SetSRID(ST_MakePoint(, ), 4326)::geography, geog::geography)

(请注意,我已将第一个 ::geography 移到 ST_SetSRID 之外,因此它设置了一个 SRID,然后将其转换为 geography)。或者等价地:

ST_Intersects(ST_MakePoint(, )::geography, geog::geography)

至于两个相交空间运算符的实际性能,这取决于您是否有 geoggeography 类型的索引 geog