2011-05-26 66 views
0

好了,我有以下表(從pgAdmin的信息):在PostgreSQL中比較小的表非常緩慢更新

CREATE TABLE comments_lemms 
(
    comment_id integer, 
    freq integer, 
    lemm_id integer, 
    bm25 real 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE comments_lemms OWNER TO postgres; 

-- Index: comments_lemms_comment_id_idx 

-- DROP INDEX comments_lemms_comment_id_idx; 

CREATE INDEX comments_lemms_comment_id_idx 
    ON comments_lemms 
    USING btree 
    (comment_id); 

-- Index: comments_lemms_lemm_id_idx 

-- DROP INDEX comments_lemms_lemm_id_idx; 

CREATE INDEX comments_lemms_lemm_id_idx 
    ON comments_lemms 
    USING btree 
    (lemm_id); 

還有一表:

CREATE TABLE comments 
(
    id serial NOT NULL, 
    nid integer, 
    userid integer, 
    timest timestamp without time zone, 
    lemm_length integer, 
    CONSTRAINT comments_pkey PRIMARY KEY (id) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE comments OWNER TO postgres; 

-- Index: comments_id_idx 

-- DROP INDEX comments_id_idx; 

CREATE INDEX comments_id_idx 
    ON comments 
    USING btree 
    (id); 

-- Index: comments_nid_idx 

-- DROP INDEX comments_nid_idx; 

CREATE INDEX comments_nid_idx 
    ON comments 
    USING btree 
    (nid); 

在comments_lemms有800萬條目,評論 - 270萬。 林執行下面的SQL查詢:

update comments_lemms set bm25=(select lemm_length from comments where id=comment_id limit 1) 

而且它需要超過20分鐘的運行,而我停下來,因爲pgAdmin的看起來像它即將崩潰。 有沒有什麼辦法可以修改這個查詢或索引或我的數據庫中的任何東西來加速一些事情?我必須在將來運行一些類似的查詢,並且等待超過30分鐘是相當痛苦的。

+0

當你說「看起來像它即將崩潰?」是什麼意思?你有沒有理由不加入? Postgres不允許更新連接? – MJB 2011-05-26 11:07:59

+0

Windows開始尖叫,pgAdmin可能停止工作。因爲我不知道更新連接,所以在sql中我是一個新手,你會看到:)我使用更新連接重寫了我的查詢,再次啓動它,現在正在等待結果顯示。 – Anton 2011-05-26 11:40:18

+0

與問題無關,但我相信'comments_id_idx'沒有必要。 Postgres在沒有被告知的情況下爲PK提供了一個獨特的索引。 – 2011-05-29 00:24:20

回答

1

in comments_lemms有800萬條目,評論 - 270萬。林執行下面的SQL查詢:

update comments_lemms set bm25=(select lemm_length from comments where id=comment_id limit 1) 

換句話說,你讓經過8M的條目,併爲每一行你正在做與索引loopup嵌套循環。由於limit 1指令,PG不會重寫/優化它。

試試這個:

update comments_lemms set bm25 = comments.lemm_length 
from comments 
where comments.id = comments_lemms.comment_id; 

應該做兩次序列掃描和散列或合併聯接在一起,然後一氣呵成繼續更新。

+0

謝謝,在我發現更新連接之後(感謝上述MJB的評論),我重寫了查詢的方式與您所做的完全相同。發射並且現在工作20分鐘。我甚至在運行查詢前對這兩個表執行了真空分析。同時從comments_lemms中選擇count(*)需要48秒,可以嗎?對於8M條目來說, – Anton 2011-05-26 11:46:41

+0

聽起來很合理,是的。 :-) – 2011-05-26 11:49:49

+0

哎呀,索引應該可以幫助我加快選擇WHERE comment_id in或lemm_id in,他們應該怎麼做?你不知道在我的腦海裏聽起來有多麼拼命,因爲我必須用這張表製作很多複雜的報告:) – Anton 2011-05-26 11:57:24