我有一张有 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%。
我不明白这个硬盘利用率,因为该表在过去一个月内已被清理,bool_value已经有每一行的记录,我删除了索引。gis命名空间中的两个表(在查询中引用)都在它们的gid字段上建立索引。那些gis命名空间表不是视图。它们只是我使用 PostGIS 的PostGIS 2.0 Shapefile 和 DBF Loader Exporter导入的 SHP 。计算机上没有其他重要的事情发生。
根据任务管理器,CPU 利用率几乎为零,即使在 postgres.exe 进程上也是如此。我认为这是由于极端的硬盘活动造成的。
计算机总共有 8GB。其中几乎一半是免费的。有 14 个并发 postgres.exe 进程打开,每个进程的大小在 2.8 MB 到 9 MB 之间。只有一个过程显示出大量活动。
这是我想知道的一件事:第二个 st_contains 中的geom_3081长度为 1.0 MB。这是一个代表德克萨斯州达拉斯市范围的 PostGIS MULTIPOLYGON。我想如果没有别的,这将被 Windows 磁盘缓存缓存,以防止重复的硬盘访问。geom_3081没有被索引,虽然我不明白为什么索引它会有所帮助,因为它没有被用来确定要返回哪些行;gid领域正在这样做。