开发者社区> 问答> 正文

postgresql standby server执行部分sql不响应,如count整个表

我使用hot_standby做的备库,给线上主库做负载(pgpool)。但是发现,备库在执行某些sql的时候一直的时候,响应时间很长,甚至几个小时没结果返回也不中断,q1,sy_bs_package這张表目前数据量在1000w+级别,数据更新很频繁,按照我的理解应该是出现了“查询冲突”,我通过pg_last_xlog_replay_location(),pg_last_xlog_receive_location(),q2
这样的情况是不是q3,这种情况呢?max_standby_streaming_delay, max_standby_archive_delay這两个配置目前都是默认30s。
我需要怎么去处理,还望大家指教。

展开
收起
dynz 2016-08-25 17:09:51 2796 0
1 条回答
写回答
取消 提交回答
  • PostgreSQL你值得拥有。

    抛开主备的问题,由于PostgreSQL采用了MVCC,所以执行select count(*) 语句本来就很慢。您可以通过类似于下面的SQL对这个问题进行验证:

    ostgres=# EXPLAIN ANALYZE SELECT COUNT(*) FROM tbl;
                                                          QUERY PLAN                                                       
    -----------------------------------------------------------------------------------------------------------------------
     Aggregate  (cost=4499.00..4499.01 rows=1 width=0) (actual time=465.588..465.591 rows=1 loops=1)
       ->  Seq Scan on tbl  (cost=0.00..4249.00 rows=100000 width=0) (actual time=0.011..239.212 rows=100000 loops=1)
     Total runtime: 465.642 ms
    (3 rows)

    可以看出,select count(*) from tbl 语句需要将tbl全表扫描一遍。

    在PostgreSQL9.2中实现了Index-only scans,对这个执行速度进行了优化,如果您的内核版本小于这个,可以升级内核。

    同时,在SELECT COUNT(*) 语句中增加WHERE字句也会加快该SQL的执行。

    如果只想对COUNT结果进行预估,可以使用Count estimate功能,参考链接

    https://wiki.postgresql.org/wiki/Count_estimate

    2019-07-17 20:05:37
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
2023云栖大会:和客户一起玩转PolarDB新特性 立即下载
2023云栖大会:PolarDB for AI 立即下载
2023云栖大会:AnalyticDB PostgreSQL 立即下载

相关镜像