2012-07-31 49 views
1

我有一個約210萬元的表。其中有經緯度專欄。我試圖將其轉換爲地理類型(與SRID點)。PostgreSQL:這是因爲鎖(行級)?

我寫的函數(過程),在限制條目的時候工作正常(比如說:SELECT id,longitude,latitude FROM list_of_location limit 50)。

CREATE OR REPLACE FUNCTION convertlatlon() RETURNS VOID AS $$ 
DECLARE rec RECORD; 
BEGIN 
    FOR rec IN SELECT id,longitude,latitude FROM list_of_location 
    LOOP 
    UPDATE list_of_location SET location= concat('SRID=4326;POINT(',rec.longitude,' ',rec.latitude,')') WHERE id=rec.id;  
    END LOOP; 
END; 
$$ LANGUAGE 'plpgsql' ; 

  • 當我嘗試在整個表上運行時,PostgreSQL似乎什麼也不做。已經等了一個半小時。
  • 使用正在運行的核心的CPU的99%。
  • 不會彈出PostgreSQL的其他實例來利用其他核心(因爲請求來自單個用戶?)。
  • 這是因爲鎖(行級)?
  • 如何規避此?

P.S.我非常肯定,這將關閉主題。但是,我必須尋找答案。

+0

「我敢肯定,這將讓封閉的題外話。」爲什麼? – 2012-07-31 15:15:59

+0

@MarkByers因爲這不是一個編程相關的問題。像這樣的東西http://stackoverflow.com/questions/11712318/problems-starting-postgresql-server-after-installing-9-1 – ThinkingMonkey 2012-07-31 15:17:16

+0

爲什麼這一個不編程相關?它似乎*對我來說 - 你甚至發佈了一些程序代碼,所以我不明白爲什麼它不應該與編程有關。我錯過了什麼嗎?無論如何,如果你仍然覺得它不是編程相關的,你可以嘗試在[dba.se](http://dba.stackexchange.com/)中發佈它。 – 2012-07-31 15:18:17

回答

4

我不知道是什麼會導致它,但它聽起來像可能會在此操作中獲取鎖。你可以很容易地驗證這一點:

SELECT * FROM pg_locks; 

會告訴你什麼是鎖目前正在採取。並且

SELECT * FROM pg_stat_activities WHERE waiting; 

會告訴你,如果有鎖,哪些事務處在閒置狀態,等待鎖被釋放。這應該指向正確的方向。

不會彈出任何其他PostgreSQL實例來利用其他核心(因爲請求來自單個用戶?)。

這是postgres的工作原理。一個會話將分離一個後端。單個查詢不會執行任何排序的多進程或併發操作。

如何規避此?

你爲什麼要循環?我認爲你可以一口氣做到這一點。爲什麼不這樣做:

UPDATE list_of_location 
SET location = ST_GeogFromText('POINT(' || longitude || ' ' || latitude || ')'); 

(假設爲您提供了正確的結果)

+1

+1表示這可以在單個語句中完成。 – 2012-07-31 16:15:35

+0

因爲沒有想到單一的陳述,所以我很mor onic。感謝有關鎖:)的信息。 – ThinkingMonkey 2012-07-31 18:20:58

+0

對。是的,在處理SQL時,在「數據集」中思考,應該讓你的生活更輕鬆。大部分。 – hgmnz 2012-07-31 21:53:07