2013-03-17 39 views
0

我有一張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字段正在這樣做。

+0

有一些想法:在此期間是否有其他方式使用該表(因爲Postgres會進行版本化,而不是鎖定,直到查詢完成時會有整個表的兩個版本)?你看過查詢計劃嗎(也許嵌套查詢導致奇怪的訪問模式)? – IMSoP 2013-03-17 22:03:44

+0

沒有其他人使用該表。即使別的東西在使用它,表格每行的數據也不會太多,所以複製表格不需要12個小時。我表中最近的**。backup **文件剛剛超過500 MB。 – 2013-03-17 22:12:52

+0

我在問題的任何地方都看不到PostgreSQL版本和表格定義? – 2013-03-17 23:17:18

回答

1

無論這裏存在其他問題(並極有可能還有其他的),這應該讓你的查詢速度更快:

UPDATE table t 
SET bool_value = x.new_bool 
FROM (
    SELECT table_id 
     ,(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 
      ) 
     ) AS new_bool 
    FROM table 
    ) upd 
WHERE t.table_id = upd.table_id 
AND t.bool_value IS DISTINCT FROM x.new_bool; 

table_id是這裏的主鍵。

校長是避免空更新。而且由於我們正在討論一個布爾值,所以很可能你有很大一部分更新實際上並沒有改變任何東西。但是這樣的更新仍然會導致磁盤活動,因爲舊行被標記爲已過時插入了新的(未更改的)行。

爲了找出其他什麼錯誤,你可以去鴻溝的可行的途徑和征服:追加到子查詢:

ORDER BY table_id 
LIMIT 10 
OFFEST 0 

如果進展順利,不斷遞增LIMITOFFSET,與更大的切片。只要性能保持良好,請增加切片的大小。一定要運行在不同的交易中。

這可能會避免緩存問題(如磁盤負載過多所示),並且還可以避免可能存在的任何併發問題。如果更新幾行仍然很慢,你肯定有其他問題。


至於:

我不明白這個硬盤利用率表已經 在過去的一個月內抽真空,

這是一種誤解。 VACUUM確實不是通常會使UPDATE更快(除了表膨脹的極端情況)。也許更慢。更糟的是VACUUM FULL。這將刪除所有無用元組,並儘可能使用活元組打包數據頁。

以下更新不能利用HOT updates,因爲個人數據頁面上沒有「擺動房間」。如果您有很多更新,請考慮fillfactor的較低設置。

在dba.SE hereherehere這些密切相關的問題中查找更多信息和鏈接。

+0

謝謝你的詳細解答。查詢在大約16個小時後結束,因此我無法使用您的建議,但這聽起來很合理。 – 2013-03-18 01:19:52