我有一張370萬行的表格。它有一個布爾值(以下稱爲bool_value),它已經對所有行都有一個值。Postgres/PostGIS SQL更新儘管沒有創建任何新數據,硬盤硬盤仍然硬着陸
我使用這個查詢UDPATE 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已經有每行的記錄了,我丟掉了索引。命名空間(在查詢中引用)中的兩個表都在其gid字段上建立索引。這些名稱空間表不是視圖。他們只是我使用PostGIS的PostGIS 2.0 Shapefile和DBF Loader Exporter導入的SHP。電腦上沒有其他重要的事情發生。
根據任務管理器,即使在postgres.exe進程中,CPU利用率也幾乎沒有。我認爲這是由於極端的硬盤驅動器活動。
電腦總共有8GB。幾乎一半是免費的。有14個併發postgres.exe進程打開,並且它們每個有2.8 MB和9 MB之間。只有其中一個過程顯示出很多活動。
這裏的一兩件事,我想知道:在geom_3081從第二st_contains爲1.0 MB長。這是代表德克薩斯州達拉斯城市範圍的PostGIS MULTIPOLYGON。我想如果沒有其他的話,這將被Windows磁盤緩存緩存,防止重複的硬盤訪問。 geom_3081沒有編入索引,但我不明白爲什麼建立索引會有幫助,因爲它沒有用於確定要返回哪些行; gid字段正在這樣做。
有一些想法:在此期間是否有其他方式使用該表(因爲Postgres會進行版本化,而不是鎖定,直到查詢完成時會有整個表的兩個版本)?你看過查詢計劃嗎(也許嵌套查詢導致奇怪的訪問模式)? – IMSoP 2013-03-17 22:03:44
沒有其他人使用該表。即使別的東西在使用它,表格每行的數據也不會太多,所以複製表格不需要12個小時。我表中最近的**。backup **文件剛剛超過500 MB。 – 2013-03-17 22:12:52
我在問題的任何地方都看不到PostgreSQL版本和表格定義? – 2013-03-17 23:17:18