• 沒有找到結果。

数据库性能调优通常发生在用户对业务的执行效率不满意,期望通过调优加快业务执 行的情况下。正如“确定性能调优范围”小节所述,数据库性能受影响因素多,从而 性能调优是一项复杂的工程,有些时候无法系统性地说明和解释,而是依赖于DBA的 经验判断。尽管如此,此处还是期望能尽量系统性的对性能调优方法加以说明,方便 应用开发人员和刚接触GaussDB(for openGauss)的DBA参考。

性能因素

多个性能因素会影响数据库性能,了解这些因素可以帮助定位和分析性能问题。

● 系统资源

数据库性能在很大程度上依赖于磁盘的I/O和内存使用情况。为了准确设置性能指 标,用户需要了解集群部署硬件的基本性能。CPU,硬盘,磁盘控制器,内存和 网络接口等这些硬件性能将显著影响数据库的运行速度。

● 负载

负载等于数据库系统的需求总量,它会随着时间变化。总体负载包含用户查询,

应用程序,并行作业,事务以及数据库随时传递的系统命令。比如:多用户在执

行多个查询时会提高负载。负载会显著地影响数据库的性能。了解工作负载高峰

a. 通过查询最耗时的SQL语句、跑不出来的SQL语句,找出耗资源的SQL,进行

SQL调优指南。

步骤1 使用DAS或者gsql连接实例。

步骤2 查询系统中长时间运行的查询语句。

SELECT current_timestamp - query_start AS runtime, datname, usename, query FROM pg_stat_activity where state != 'idle' ORDER BY 1 desc;

查询后会按执行时间从长到短顺序返回查询语句列表,第一条结果就是当前系统中执 行时间最长的查询语句。返回结果中包含了系统调用的SQL语句和用户执行SQL语句,

请根据实际找到用户执行时间长的语句。

若当前系统较为繁忙,可以通过限制current_timestamp - query_start大于某一阈值来 查看执行时间超过此阈值的查询语句。

SELECT query FROM pg_stat_activity WHERE current_timestamp - query_start > interval '1 days';

步骤3 设置参数track_activities为on。

SET track_activities = on;

当此参数为on时,数据库系统才会收集当前活动查询的运行信息。

步骤4 查看正在运行的查询语句。

以查看视图pg_stat_activity为例:

SELECT datname, usename, state FROM pg_stat_activity;

datname | usename | state |

SELECT datname, usename, state FROM pg_stat_activity WHERE state != 'idle';

步骤5 分析长时间运行的查询语句状态。

● 若查询语句处于正常状态,则等待其执行完毕。

● 若查询语句阻塞,则通过如下命令查看当前处于阻塞状态的查询语句:

SELECT datname, usename, state, query FROM pg_stat_activity WHERE waiting = true;

查询结果中包含了当前被阻塞的查询语句,该查询语句所请求的锁资源可能被其

步骤1 使用DAS或者gsql连接实例。

步骤2 查看阻塞的查询语句及阻塞查询的表、模式信息。

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;

该查询返回线程ID、用户信息、查询状态,以及导致阻塞的表、模式信息。

步骤3 使用如下命令结束相应的会话。

SELECT PG_TERMINATE_BACKEND(139834762094352);

其中,139834762094352为线程ID。

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

PG_TERMINATE_BACKEND --- t (1 row)

显示类似如下信息,表示用户正在尝试结束当前会话。

FATAL: terminating connection due to administrator command FATAL: terminating connection due to administrator command

说明

● gsql客户端使用PG_TERMINATE_BACKEND函数结束当前正在执行会话的后台线程时,如果 当前的用户是初始用户,客户端不会退出而是自动重连,即还会返回“The connection to the server was lost. Attempting reset: Succeeded.”;否则客户端会重连失败,即返回

“The connection to the server was lost. Attempting reset: Failed.”。这是因为只有初始 用户可以免密登录,普遍用户不能免密登录,从而重连失败。

● 对于使用PG_TERMINATE_BACKEND函数结束非活跃的后台线程时。如果打开了线程池,此 时空闲的会话没有线程ID,无法结束会话。非线程池模式下,结束的会话不会自动重连。

track_stmt_session_slot

作用:设置一个session缓存的最大的全量/慢SQL的数量。

影响:缓存的SQL定期会被写入到系统表,如果业务量很大,超过这个数量语句 执行将不会被跟踪,直到落盘线程将缓存语句落盘,留出空闲的空间,但不影响 SQL的执行。

effective_cache_size

作用:设置节点优化器在一次单一的查询中可用的磁盘缓冲区的有效大小。设置

enable_stream_operator

控制优化器对stream的使用。当该参数关闭时,可能会有大量关于计划不能下推 的日志记录到日志文件中。

log_min_duration_statement

作用:当某条语句的持续时间大于或者等于特定的毫秒数时,记录每条完成语句 的持续时间。设置log_min_duration_statement可以很方便地跟踪需要优化的查 询语句。对于使用扩展查询协议的客户端,语法分析、绑定、执行每一步所花时 间被独立记录。

影响:设置过低的阈值可能影响负载吞吐,-1表示关闭此功能。

审计参数

audit_system_object

作用:该参数决定是否对数据库对象的CREATE、DROP、ALTER操作进行审计。

数据库对象包括DATABASE、USER、schema、TABLE等。通过修改该配置参数的 值,可以只审计需要的数据库对象的操作,在主备强制选主场景建议。

影响:不当修改该参数会导致丢失DDL审计日志,请在客服人员指导下进行修 改。

锁管理

update_lockwait_timeout

设置并发更新同一行数据时单个锁的最长等待时间,当申请的锁等待时间超过设 定值时系统会报错。0表示不会超时,默认值为2min。

连接与认证

session_timeout

表明与服务器建立连接后,不进行任何操作一定时间后超时的限制,0表示关闭超 时设置。

failed_login_attempts

设置密码错误次数上限,输入密码错误的次数达到该参数所设置的值时,账户将 会被自动锁定,配置为0时表示不限制密码输入错误的次数。

password_effect_time

设置帐户密码的有效时间,0表示不开启有效期限制功能。

password_lock_time

设置账户被锁定后的自动解锁时间,单位为天。