Postgresql 在ST_有效的地方使用是否会提高性能?

Postgresql 在ST_有效的地方使用是否会提高性能?,postgresql,postgis,Postgresql,Postgis,我在Windows上使用PostgreSQL 9.2和PostGIS 2.0.1 考虑一个名为geom列的表some\u table 问题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)?根据Crai

我在Windows上使用PostgreSQL 9.2和PostGIS 2.0.1

考虑一个名为
geom
列的表
some\u table

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

根据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%。这也意味着,如果实际上所有的行都有效,那么检查性能就没有好处了


所以答案是,你真的需要在你的特定集合上检查
解释分析

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

例如,假设您的表的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%。这也意味着,如果实际上所有的行都有效,那么检查性能就没有好处了


因此,答案是,您确实需要在您的特定集合上检查
解释分析

解释分析
,然后查看。我想这取决于无效数据的比例,取决于
某个表上是否有函数索引使用(ST\u IsValid(geom))
以及
ST\u IsValid
ST\u MakeValid
@CraigRinger的相对成本,我认为有一个关于有效性的索引是一个相当罕见的用例。不知道?非常清楚,但你永远不知道有些人会如何安排事情,或者其他人会以不同的目标或情况阅读本文。
EXPLAIN ANALYZE
并查看。我想这取决于无效数据的比例,取决于
某个表上是否有函数索引使用(ST\u IsValid(geom))
以及
ST\u IsValid
ST\u MakeValid
@CraigRinger的相对成本,我认为有一个关于有效性的索引是一个相当罕见的用例。不是吗?很好,但你永远不知道有些人会怎么安排,或者其他人会带着不同的目标或情况阅读这篇文章。