我有一个简单的更新查询(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)
如果'id'是PK(所以至多有一个更新的行),这实际上应该是瞬时的。要么你有一些问题(运行真空分析详细)或其他一些查询锁定整个表...你不能ideintify你的postgresql日志中的200s查询?你在配置中设置了“log_duration”参数吗? – leonbloy 2010-05-25 01:02:30
是的,我将“log_min_duration_statement”设置为1000,这就是为什么我在缓慢文件中获得这些查询。从那个日志文件中识别出那些200个查询,并且只是这些简单的更新。 在这种情况下,postgresql锁定整个表,是不是通过行级别锁定来管理? 有什么方法可以确定“谁”锁定了这个?这有可能是这个缓慢的查询是新创建的行的原因?只是猜测,我没有其他的想法 – matija 2010-05-25 06:56:54
postgresql,更新不会锁定读者,所以锁定可能不是问题。你有没有调整像shared_buffers参数?那些无法预料的慢慢发生的查询会在特定的时间发生吗?它们是偶尔发生几次还是一次? – araqnid 2010-05-25 12:46:06