SQL执行很慢,性能低,有时长时间运行未结束
- 1、问题现象
- 2、原因分析
- SQL运行慢,主要可以从以下几方面进行分析:
- 3、处理方法
1、问题现象
SQL执行很慢,性能低,有时长时间运行未结束。
2、原因分析
SQL运行慢,主要可以从以下几方面进行分析:
1、使用EXPLAIN命令查看SQL执行计划,根据执行计划判断是否需要进行SQL调优。
2、分析查询是否被阻塞,导致语句运行时间过长,可以强制结束有问题的会话。
3、审视和修改表定义。选择合适的分布列,避免数据倾斜。
4、分析SQL语句是否使用了不下推的函数,建议更换为支持下推的语法或函数。
5、对表定期做vacuum full和analyze,可回收已更新或已删除的数据所占据的磁盘空间。
6、检查表有无索引支撑,建议例行重建索引。数据库经过多次删除操作后,索引页面上的索引键将被删除,造成索引膨胀。例行重建索引,可有效的提高查询效率。
7、对业务进行优化,分析能否将大表进行分表设计。
3、处理方法
GaussDB(DWS) 提供了分析查询和改进查询的方法,并且为用户提供了一些常见案例以及错误处理办法。您可以参考优化查询性能章节对SQL进行性能调优。常见问题也可以优先参考以下两种方法进行分析:
方法一:对表定期做统计优化查询
变化的表,如果经常insert
语句到表中,需要做analyze
表,具体语句为:
Analyze tablename;
经常变化的表,如果经常删除delete
数据,需要做vacuum full
表1,具体语句为:
Vacuum full tablename;
查询表大小,如果表非常大,而实际只有很少数据,那么应该执行vacuum full
对表进行磁盘碎片整理。
select *
from pg_size_pretty(pg_table_size('tablename'));
方法二:通过pgxc_stat_activity
查询正在运行的sql相关信息
查询后台活跃sql
SELECT pid
, datname
, usename
, state,waiting
, query
FROM pgxc_stat_activity
WHERE state <> 'idle';
查询后台业务有锁的sql
SELECT pid
, datname
, usename
, state
, waiting
, query
FROM pgxc_stat_activity
WHERE state <> 'idle'
AND waiting=true;
判断是否被锁
如果没有锁,查找相关业务sql,按照方法一中的判断方法进行处理。
如果有锁,则查找出pid字段,使用如下函数,结束任务,释放锁。
SELECT pg_terminate_backend(pid);
- 执行
vacuum full
语句时注意不能有其他任务在跑。 ↩︎