PostgreSQL: 业务框架SQL导致 PostgreSQL 负载高一例

最近刚上了新业务,在业务前期业务量不是很大, 但数据库负载有点高,达到 3 到 4左右,接着到数据库里查询一番,发现业务的慢SQL 很少,奇怪的是有个非常大的SQL在跑,之所以奇怪是因为这个SQL 查的是 PostgreSQL 的系统表,显然不是业务系统发起,而且这个SQL每天执行的量比较大,下面是详细信息。

问题 SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
SELECT conname, consrc, contype, indkey FROM (  
SELECT
conname,
CASE WHEN contype='f' THEN
pg_catalog.pg_get_constraintdef(oid)
ELSE
'CHECK (' || consrc || ')'
END AS consrc,
contype,
conrelid AS relid,
NULL AS indkey
FROM
pg_catalog.pg_constraint
WHERE
contype IN ('f', 'c')
UNION ALL
SELECT
pc.relname,
NULL,
CASE WHEN indisprimary THEN
'p'
ELSE
'u'
END,
pi.indrelid,
indkey
FROM
pg_catalog.pg_class pc,
pg_catalog.pg_index pi
WHERE
pc.oid=pi.indexrelid
AND EXISTS (
SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c
ON (d.refclassid = c.tableoid AND d.refobjid = c.oid)
WHERE d.classid = pc.tableoid AND d.objid = pc.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p')
)
) AS sub
WHERE relid = (SELECT oid FROM pg_catalog.pg_class WHERE relname='coin_businesses'
AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace
WHERE nspname='freecoin'))

备注:根据 pg_stat_activity 的 client_addr 字段,知道了发起这个 SQL的源IP。

查询结果

 conname | consrc | contype | indkey  
----------------------+--------+---------+--------  
coin_businesses_pkey | | p | 1  

备注:于是找来开发人员,和开发人员沟通后,原来这个语句是他们用的一个框架发起,会不停地查询数据库结构。

解决方法

后来开发人员将这个查询做到缓存,不需要时时查询数据库,这个SQL解决之后,数据库平均负载下降40% 左右。

原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/237813.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论