370 万行のテーブルがあります。ブール値 (以下ではbool_valueと呼びます) があり、すべての行に既に値があります。
このクエリを使用して bool_value を更新しています:
DROP INDEX IF EXISTS table_bool_value_idx;
UPDATE table
SET bool_value = (
st_contains(st_setsrid((SELECT geom FROM gis.cntys04_3081 WHERE gid=57), 3081), the_geom)
AND st_contains((SELECT geom_3081 FROM gis.stratmap_city_poly_v4 WHERE gid = 127), the_geom)
);
このクエリは、これまでに約 12 時間実行されています。ハードドライブの使用率はずっと 100% です。
過去 1 か月以内にテーブルがバキューム処理されたため、このハード ドライブの使用率がわかりません。bool_valueには各行のレコードが既にあり、インデックスを削除しました。gis名前空間 (クエリで参照される)の両方のテーブルは、gidフィールドでインデックス化されます。これらのgis名前空間テーブルはビューではありません。これらは、PostGIS のPostGIS 2.0 Shapefile と DBF Loader Exporterを使用してインポートした SHP にすぎません。コンピューター上で他に重要なことは何も起きていません。
タスク マネージャーによると、postgres.exe プロセスであっても、CPU 使用率はほとんどありません。これは、極端なハード ドライブ アクティビティが原因であると考えられます。
パソコンは全部で8GB。その約半分は無料です。14 個の同時 postgres.exe プロセスが開いており、それぞれ 2.8 MB から 9 MB の容量があります。プロセスの 1 つだけが多くのアクティビティを示しています。
1 つ気になる点があります。2番目のst_containsのgeom_3081の長さは 1.0 MB です。これは、テキサス州ダラスの市境を表す PostGIS MULTIPOLYGON です。これは、少なくとも Windows のディスク キャッシュによってキャッシュされ、ハード ドライブへのアクセスが繰り返されるのを防いでいると思います。geom_3081はインデックス化されていませんが、返す行を決定するために使用されていないため、インデックス化が役立つ理由はわかりません。gidフィールドがそれを行っています。