问题单:【数据统计】插入的数据等了5S后仍然统计不出来 https://gitee.com/opengauss/openGauss-server/issues/I6O24O
@wx_84fcc584df 您好,经CCB裁决,同意该问题单为非问题,解释如下: alter system set autovacuum to off; drop table if exists sales; select pg_stat_reset();
CREATE TABLE sales (prod_id numeric(6), cust_id numeric, time_id DATE, channel_id CHAR(1), promo_id numeric(6), quantity_sold numeric(3), amount_sold numeric(10,2) ); INSERT INTO sales VALUES(1, 12, '2019-02-01 00:00:00', 'b', 1, 1, 1); SELECT pg_sleep(1); select pg_stat_get_blocks_fetched(a.oid) from PG_CLASS a where a.relname = 'sales';
考虑这个场景,后台worker线程每次处理sql都会触发执行一次pgstat_report_stat,如issue描述中,该函数会判断当前时间和上次上报时间间隔超过0.5S时才会上报给PgstatCollector,insert完成后距离上一次上报还不到0.5s(首次连接时触发的pgstat_report_stat会上报),因此不会上报。等下一次sleep(1)后触发时才上报。 PgstatCollector接收到报告消息时,也不会立马刷到磁盘文件pgstat.stat,有其他线程发起刷新请求时才会写文件。worker线程在查询pg_stat_get_blocks_fetched时会读取pgstat.stat,并要求该文件在0.5s内被更新过,否则等待或发起刷新请求。 GlobalStatsTracker线程每隔20s会发送刷新请求给PgstatCollector,PgstatCollector接收到后便更新pgstat.stat。有一种特殊场景是,在worker线程sleep(1)后触发上报之前的某一时刻,GlobalStatsTracker发起了一次刷请请求,文件被更新,且没有worker线程准备要上报的信息。后面worker查询pg_stat_get_blocks_fetched时距离文件上一次更新又在0.5s内,就直接返回结果。 建议修改用例,将pg_sleep(1)改为连续两次pg_sleep(0.5),这时候第一次sleep完成后会触发上报,第二次0.5s后的查询要么由自己去发起刷新请求,要么在第二次的0.5s内由GlobalStatsTracker发起的请求更新文件,同样会记录worker上报的信息。这样能保证用例稳定成功。
经过CCB裁决,同意按上述修改用例,公示该问题单7天,并于公示结束后关闭该问题单。
若提单人看到此邮件,还有其他问题,可以在issue下答复,谢谢。