1

我在 Windows 上使用 PostgreSQL 9.2 和 PostGIS 2.0.1。

考虑一个包含名为some_tableGEOMETRY列的表geom

查询一:

UPDATE some_table
SET geom = ST_MakeValid(geom)

查询 2:

UPDATE some_table
SET geom = ST_MakeValid(geom)
WHERE NOT ST_IsValid(geom)

调用ST_IsValid作为过滤器(如在查询 2 中)是否提供任何性能提升(超过查询 1)?

4

1 回答 1

1

扩展克雷格的评论,答案是“也许”。这里有很多可能的答案,这取决于很多事情。

例如,假设 80% 的表是无效的,而您关心那 20%。现在假设 ST_IsValid 占用了 ST_MakeValid 所用 CPU 时间的 60%。您将在所有表 (0.6 * 1) 上运行 ST_IsValid 并在其他 20% (1 * 0.2) 上运行 ST_MakeValid 函数。如果没有索引,这将为您节省大约 20% 的时间。如果您有一个功能索引,它可能会为您节省大量时间(这些数字当然是假设的)。

另一方面,假设您的表的一半无效。您将在所有行 (0.6 * 1) 上运行更便宜的函数,而在另一行 (1 * 0.5) 上运行更昂贵的函数,导致查询的净速度下降约 10%。这也意味着,如果几乎所有行都有效,那么检查在性能方面不会有任何好处。

所以答案是你真的需要检查EXPLAIN ANALYSE你的特定集合。

于 2013-05-05T13:57:35.437 回答