1

WindowsでPostGIS2.0.1とともにPostgreSQL9.2を使用しています。

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)

(クエリ2のように)フィルタとして呼び出すST_IsValidと、(クエリ1よりも)パフォーマンスが向上しますか?

4

1 に答える 1

1

クレイグのコメントを拡張すると、答えは「たぶん」です。ここには多くの可能な答えがあり、それは多くのことに依存します。

たとえば、テーブルの80%が無効であり、その20%を気にしているとします。そして、ST_IsValidがST_MakeValidのCPU時間の60%を占めると仮定します。すべてのテーブル(0.6 * 1)でST_IsValidを実行し、さらに他の20%(1 * 0.2)でST_MakeValid関数を実行します。これにより、インデックスなしで時間の約20%を節約できます。機能インデックスがある場合は、時間を大幅に節約できる可能性があります(もちろん、数値は架空のものです)。

一方、テーブルの半分が無効だったとします。すべての行でより安価な関数(0.6 * 1)を実行し、もう一方の行(1 * 0.5)でより高価な関数を実行すると、クエリの正味の速度が約10%低下します。これは、事実上すべての行が有効である場合、パフォーマンスの面でチェックするメリットがないことも意味します。

EXPLAIN ANALYSEしたがって、答えは、特定のセットを実際に確認する必要があるということです。

于 2013-05-05T13:57:35.437 に答える