2010-05-24 99 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

相关问题