使用WHERE ST_IsValid会提高性能吗?

问题描述:

我在Windows上使用PostgreSQL 9.2和PostGIS 2.0.1。使用WHERE ST_IsValid会提高性能吗?

考虑表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)?

+2

'EXPLAIN ANALYZE'并参见。我想这取决于无效数据的比例,是否有'some_table USING(ST_IsValid(geom))'函数索引和'ST_IsValid'与'ST_MakeValid'的相对成本。 – 2013-03-06 23:37:24

+0

@CraigRinger我认为这将是一个相当不常见的用例,因为有一个有效性的索引。没有? – jpmc26 2013-03-07 00:33:09

+0

非常,但你永远不知道有些人会怎么设置,或者有谁会用不同的目标或情况阅读这些内容。 – 2013-03-07 01:38:44

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

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

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

所以答案是,你真的需要检查你的具体设置EXPLAIN ANALYSE