暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【openGauss】系统中部分查询语句运行时间过长

原创 酷哥 2022-04-29
617

【问题现象】

系统中部分查询语句运行时间过长。

【可能原因】

  • 查询语句较为复杂,需要长时间运行。

  • 查询语句阻塞。

【解决办法】

  1. 查询语句较为复杂,需要长时间运行。

  2. 查询语句阻塞。

    gsql -d postgres -p 8000
    

    postgres为需要连接的数据库名称,8000为端口号。

  3. 查看系统中长时间运行的查询语句。

    SELECT timestampdiff(minutes, query_start, current_timestamp) AS runtime, datname, usename, query FROM pg_stat_activity WHERE state != 'idle' ORDER BY 1 desc;

    查询会返回按执行时间长短从大到小排列的查询语句列表。第一条结果就是当前系统中执行时间长的查询语句。

    如果当前系统较为繁忙,可以使用TIMESTAMPDIFF函数通过限制current_timestamp和query_start大于某一阈值查看执行时间超过此阈值的查询语句。timestampdiff的第一个参数为时间差单位。例如,执行超过2分钟的查询语句可以通过如下语句查询。

    SELECT query FROM pg_stat_activity WHERE timestampdiff(minutes, query_start, current_timestamp) > 2;
    
  4. 分析长时间运行的查询语句状态。

    • 如果查询语句处于正常状态,则等待其执行完毕。
    • 如果查询语句阻塞,请执行步骤5-步骤8。
  5. 以操作系统用户omm登录主机。
  6. 使用如下命令连接数据库。
    gsql -d postgres -p 8000
    

    postgres为需要连接的数据库名称,8000为端口号。

  7. 从当前活动会话视图查找问题会话的线程ID。

    SELECT w.query AS waiting_query, w.pid AS w_pid, w.usename AS w_user, l.query AS locking_query, l.pid AS l_pid, l.usename AS l_user, t.schemaname || '.' || t.relname AS tablename FROM pg_stat_activity w JOIN pg_locks l1 ON w.pid = l1.pid AND NOT l1.granted JOIN pg_locks l2 ON l1.relation = l2.relation AND l2.granted JOIN pg_stat_activity l ON l2.pid = l.pid JOIN pg_stat_user_tables t ON l1.relation = t.relid WHERE w.waiting = true;
    
  8. 根据线程ID结束会话。

    SELECT pg_terminate_backend(139834762094352);
    

      显示类似如下信息,表示结束会话成功。

    pg_terminate_backend 
    ---------------------
    t
    (1 row)
    

    显示类似如下信息,表示用户正在尝试结束当前会话,此时仅会重连会话,而不是结束会话。

    FATAL:  terminating connection due to administrator command 
    FATAL:  terminating connection due to administrator command The connection to the server was lost. Attempting reset: Succeeded.
    
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论