使用 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 隐式操作 geometry
或 geography
类型。根据您是否使用 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)
至于两个相交空间运算符的实际性能,这取决于您是否有 geog
或 geography
类型的索引 geog
。
我正在使用 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 隐式操作 geometry
或 geography
类型。根据您是否使用 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)
至于两个相交空间运算符的实际性能,这取决于您是否有 geog
或 geography
类型的索引 geog
。