我在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)?
答案 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
。