count的性能优化
# 问题
今天测试给我提了BUG,发现某个查询接口超时了,超时时间为1分钟。
目前的用的数据库是clickhouse,数据量大概在20亿左右
# 定位问题
我通过调试将查询数据的语句打印出来,查询语句放在数据库中执行,发现几秒就查询完成了,这个时候我就奇了怪了,后面我再仔细看接口的代码,跟踪调试后发现,除了会查询数据之外,还会执行查询数据量的语句。
我将查询数量的语句打印出来,执行该语句,发现是超过1分钟的,看来是定位到问题了。
# 查询分析
语句大概是下面这样的,大概有30多张表,也就是需要union
30多张表
select
count(*)
from
(
select
a_field,
b_field,
c_field,
d_field,
e_field,
f_field
from
A
union
all
select
a_field,
b_field,
c_field,
d_field,
e_field,
f_field
from
B
)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
这条语句是通过将多个表union成一个大表,然后再count求数量。
问题显而易见,为啥我们要构造一张这么大的表在内存中再count数量,直接count每张表的数量再相加不就是了。优化语句如下:
select
count(cnt)
from
(
select
count() as cnt
from
A
union
all
select
count() as cnt
from
B
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
将该语句放在数据库查询,秒级返回,直接从1分钟优化到1秒钟
上次更新: 2023/05/01, 18:02:43