count的性能优化

2023-03-06 19:51:00 浏览数 (1)

# 问题

今天测试给我提了BUG,发现某个查询接口超时了,超时时间为1分钟。

目前的用的数据库是clickhouse,数据量大概在20亿左右

# 定位问题

我通过调试将查询数据的语句打印出来,查询语句放在数据库中执行,发现几秒就查询完成了,这个时候我就奇了怪了,后面我再仔细看接口的代码,跟踪调试后发现,除了会查询数据之外,还会执行查询数据量的语句。

我将查询数量的语句打印出来,执行该语句,发现是超过1分钟的,看来是定位到问题了。

# 查询分析

语句大概是下面这样的,大概有30多张表,也就是需要union30多张表

代码语言:javascript复制
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
    )

这条语句是通过将多个表union成一个大表,然后再count求数量。

问题显而易见,为啥我们要构造一张这么大的表在内存中再count数量,直接count每张表的数量再相加不就是了。优化语句如下:

代码语言:javascript复制
select
    count(cnt)
from
    (
        select
            count() as cnt
        from
            A
        union
        all
        select
            count() as cnt
        from
            B
    )

将该语句放在数据库查询,秒级返回,直接从1分钟优化到1秒钟

0 人点赞