2010-05-24 108 views
4

我有一個簡單的更新查詢(FOO列類型是布爾型(默認爲false)):爲什麼是PostgreSQL的更新查詢,以便慢有時,即使索引

update tablename set foo = true where id = 234; 

其中「ID」被設定爲(主)關鍵,如果我跑「解釋分析」我得到:

Index Cond: (id = 234) 
Total runtime: 0.358 ms 

不過,我仍然在緩慢的日誌(pgfouine),歷時超過200秒以上有大量不明原因的查詢(?!):

Times executed: 99, Av. duration (s): 70 

任何人都可以請解釋,這是什麼原因? (表中的1.5百萬行,postgresql 8.4)

+0

如果'id'是PK(所以至多有一個更新的行),這實際上應該是瞬時的。要麼你有一些問題(運行真空分析詳細)或其他一些查詢鎖定整個表...你不能ideintify你的postgresql日誌中的200s查詢?你在配置中設置了「log_duration」參數嗎? – leonbloy 2010-05-25 01:02:30

+0

是的,我將「log_min_duration_statement」設置爲1000,這就是爲什麼我在緩慢文件中獲得這些查詢。從那個日誌文件中識別出那些200個查詢,並且只是這些簡單的更新。 在這種情況下,postgresql鎖定整個表,是不是通過行級別鎖定來管理? 有什麼方法可以確定「誰」鎖定了這個?這有可能是這個緩慢的查詢是新創建的行的原因?只是猜測,我沒有其他的想法 – matija 2010-05-25 06:56:54

+0

postgresql,更新不會鎖定讀者,所以鎖定可能不是問題。你有沒有調整像shared_buffers參數?那些無法預料的慢慢發生的查詢會在特定的時間發生嗎?它們是偶爾發生幾次還是一次? – araqnid 2010-05-25 12:46:06

回答

2

我的第一個猜測是你有一些其他查詢鎖定整個表或正在更新的行。您的簡單更新是被迫等待其他操作完成。

1

檢查您的更新列沒有任何索引或約束。如果是這樣,那麼數據庫可能正在進行索引重新計算或約束評估。這些附加任務不包含在EXPLAIN ANALYZE結果中。

其他可能性是由於I/O操作導致速度較慢。檢查這thread about UPDATE performance in Postgres

+1

回覆:慢速更新,這可能也是有用的:http://stackoverflow.com/questions/3361291/slow-simple-update-query-on-postgresql-數據庫與 - 300萬行#comment3495735_3361903 – 2013-09-09 12:28:39

相關問題