2013-03-06 55 views
1

我在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

回答

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%。這也意味着,如果幾乎所有的行都是有效的,那麼檢查性能方面沒有任何好處。

所以答案是,你真的需要檢查你的具體設置EXPLAIN ANALYSE