我有一个运行PostgreSQL 9.3的Amazon RDS实例,它运行在会话池模式下运行的pgbouncer 14.2实例,为运行在nginx之上的PHP Codeigniter应用程序提供服务。
在过去几周内,似乎数据库连接缓慢累积,直到达到最大连接数,并且无法对数据库运行查询,迫使我们重新启动pgbouncer(从而中止连接)。
在查看pgbouncer和nginx的日志以及RDS监控之后,我决定检查数据库,发现一些查询运行了几个小时没有明显的原因。
目前,我有一个非常简单的查询,运行时间超过4小时:
SELECT json_cache
FROM cache
WHERE id='27325'
AND passengers_id = '26817'`
表格如下:
CREATE TABLE public.cache
(
id bigserial NOT NULL DEFAULT nextval('cache_id_seq'::regclass),
passengers_id int8 NOT NULL,
created_on timestamptz NOT NULL DEFAULT 'now()',
json_cache text(2147483647),
isr_xml text(2147483647),
passengers_route_history_id int8,
CONSTRAINT pk_cache PRIMARY KEY (id)
);
CREATE INDEX pk_cache ON cache (id);
这是EXPLAIN ANALYZE输出:
Index Scan using pk_cache on cache
(cost=0.29..8.31 rows=1 width=724) (actual time=0.033..0.036 rows=1 loops=1)
Index Cond: (id = 27325)
Filter: (passengers_id = 26817)
Total runtime: 0.074 ms
(4 rows)
这个表有一些不到30k的行,查询很简单,所以我无法弄清楚它为什么花了这么长时间。
它也不是唯一需要这么长时间的查询,现在还有两个简单的查询运行了几个小时,根据pg_stat_activity中的信息,它们似乎都没有等待锁定。
这是我第一次询问有关DB的相关问题而我实际上并不十分熟悉PostgreSQL,所以如果有任何我遗漏的信息(请给我们提供信息)让我知道。