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 full1,具体语句为:

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);

  1. 执行vacuum full 语句时注意不能有其他任务在跑。 ↩︎