SQL执行很慢,性能低,有时长时间运行未结束
问题现象
SQL执行很慢,性能低,有时长时间运行未结束。
原因分析
SQL运行慢可从以下几方面进行分析:
处理方法
GaussDB(DWS)提供了分析查询和改进查询的方法,并且为用户提供了一些常见案例以及错误处理办法。您可以参考性能调优章节对SQL进行性能调优。常见问题也可以优先参考以下两种方法进行分析:
- 方法一:对表定期做统计优化查询。
如果频繁对表执行DELETE语句删除数据,需要定期对表执行VACUUM FULL:
1
VACUUM FULL table_name;
执行VACUUM FULL语句时需选择空闲时间窗或停止业务时操作。
查询表大小,如果表非常大,而实际只有很少数据,那么应该执行VACUUM FULL对表进行磁盘碎片整理。1 2
SELECT * FROM pg_size_pretty(pg_table_size('tablename')); VACUUM FULL table_name;
方法二:通过PGXC_STAT_ACTIVITY视图查询正在运行的SQL语句信息。
- 查看当前正在运行(非idle)的SQL信息:
1
SELECT pid,datname,usename,state,waiting,query FROM pgxc_stat_activity WHERE state <> 'idle';
- 查看当前处于阻塞状态的查询语句:
1
SELECT pid,datname, usename, state,waiting,query FROM pgxc_stat_activity WHERE state <> 'idle' and waiting=true;
- 判断查询语句是否阻塞。
- 如果没有阻塞,查找相关业务表,按照方法一中的建议方法进行处理。
- 如果存在语句阻塞,根据所查找的问题会话的线程ID,结束阻塞的执行语句。
1
SELECT pg_terminate_backend(pid);