长查询和长事务调优
长查询或长事务将影响autovacuum对旧版本的清理,数据更新操作产生的旧版本将不能被及时清理。
数据访问时,需要遍历旧版本进行可见性判断,以便确定对当前查询快照可见的版本。长查询或长事务持续的时间越久,不能及时清理的旧版本就越多,对访问性能的影响也越大。极端场景下,例如考察基于较小数据量的索引点查吞吐的场景,旧版本增多将导致吞吐下降明显,性能受损可能在50%以上。
另外,不能及时清理旧版本,也会导致额外的存储空间占用,出现表膨胀、索引膨胀现象,数据访问时,额外的IO增加,也将会对性能产生一定影响。
Astore索引和表数据都采用非原地更新,更新索引键或非索引键,将产生索引旧版本和数据旧版本。Ustore索引采用非原地更新、数据采用原地更新,更新索引键将产生索引旧版本和数据旧版本,更新非索引键只产生数据旧版本。
长查询和长事务会Astore和Ustore的访问性能都会产生影响。
用户在业务实现上,应尽量避免长查询或长事务,可通过访问pg_stat_activity、pg_running_xacts观察系统中是否存在长查询或长事务,然后利用pg_cancel_backend(pid int)、pg_terminate_backend(pid int)函数取消掉长查询或长事务。