我有一些非常简单的查询,偶尔运行非常慢。
表viewed_sites大约有10-20行。
运行 EXPLAIN ANALYZE 的运行时间总是少于 3 毫秒。
当查询自动运行时(每 10 秒),它偶尔需要一秒钟以上的时间才能运行。
查询:
INSERT INTO ga.viewed_sites (site_id) VALUES ('gop2')
桌子:
CREATE TABLE viewed_sites (
site_id character varying(4) NOT NULL,
last_viewed timestamp with time zone DEFAULT now() NOT NULL
);
(偶尔的)日志结果:
2010-05-24 15:47:55 UTC LOG: duration: 1044.632 ms statement: INSERT INTO ga.viewed_sites (site_id) VALUES ('gop2')
这是一个非常模糊的问题,但是什么原因造成的呢?我想这可能是 CPU、RAM、HDD 或以上几种的组合。
Postgresql 8.3,Ubuntu 8.04
英特尔(R) Core(TM)2 双核 CPU E6750 @ 2.66GHz
2 GiB 内存
答案1
或者,表可能被锁定。在所有情况下,这似乎更有可能。Postgresql 对于锁定非常保守,但这种情况可能发生。等待 HD 写入或 CPU 一秒钟似乎极不可能。而且,插入不需要太多内存。检查表pg_locks
(并pg_stat_activity
查看它们在做什么),以及函数pg_lock_status()
,或一些与锁定状态有关的其他表和函数。
答案2
表有外键吗?如果必须检查外键约束,则必须进行表查找。这可能会减慢速度。