我在Windows上使用PostgreSQL 9.2和PostGIS 2.0.1。
考虑一个名为some_tableGEOMETRY列的表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)?

最佳答案

根据克雷格的评论,答案是“也许”。这里有很多可能的答案,这取决于很多事情。
例如,假设80%的表是无效的,而您关心的是20%。现在假设stu IsValid占用了stu MakeValid占用的60%的CPU时间。您将在所有表(0.6*1)上运行stu IsValid,另外在其他20%(1*0.2)上运行stu MakeValid函数。如果没有索引,这将节省大约20%的时间。如果你有一个函数索引,它可能会帮你节省很多时间(当然数字是假设的)。
另一方面,假设你的桌子有一半是无效的。您可以在所有行(0.6*1)上运行廉价的函数,在另一行(1*0.5)上运行更昂贵的函数,这将导致查询速度净下降约10%。这也意味着,如果几乎所有的行都是有效的,那么在性能方面进行检查是没有好处的。
所以答案是你真的需要在你的特定集合上用EXPLAIN ANALYSE来检查。

关于postgresql - 使用WHERE ST_IsValid是否有性能提升?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15260180/

10-09 21:34