在postgresl 9.0上我们有一个SQL查询:
SELECT count(*) FROM lane
WHERE not exists
(SELECT 1 FROM id_map
WHERE id_map.new_id=lane.lane_id
and id_map.column_name='lane_id'
and id_map.table_name='lane')
and lane.lane_id is not null;
Run Code Online (Sandbox Code Playgroud)
这通常需要大约1.5秒才能完成.这是解释计划:http://explain.depesz.com/s/axNN
有时虽然此查询挂起但无法完成.它甚至可以运行11个小时但没有成功.然后它占用了100%的cpu.
此查询所采用的唯一锁定是"AccessShareLock",它们都被授予.
SELECT a.datname,
c.relname,
l.transactionid,
l.mode,
l.granted,
a.usename,
a.current_query,
a.query_start,
age(now(), a.query_start) AS "age",
a.procpid
FROM pg_stat_activity a
JOIN pg_locks l ON l.pid = a.procpid
JOIN pg_class c ON c.oid = l.relation
ORDER BY a.query_start;
Run Code Online (Sandbox Code Playgroud)
该查询作为使用连接池连接到数据库的java进程的一部分运行,并执行此格式的顺序类似的选择查询:
SELECT count(*) FROM {} WHERE not exists (SELECT 1 FROM id_map WHERE id_map.new_id={}.{} and id_map.column_name='{}' …Run Code Online (Sandbox Code Playgroud)