使用WHERE ST_IsValid会有性能提升吗?

时间:2013-03-06 23:24:28

标签: postgresql postgis

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

考虑一个表some_table,其中GEOMETRY列名为geom

查询1:

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)?

1 个答案:

答案 0 :(得分:1)

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

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

另一方面假设你的一半桌子无效。你可以在所有行(0.6 * 1)上运行更便宜的功能,然后在另一行(1 * 0.5)上运行更昂贵的功能,导致查询的净减速约10%。这也意味着如果几乎所有行都有效,那么检查就没有任何好处。

所以答案是你真的需要在你的特定集合上查看EXPLAIN ANALYSE

相关问题