PolarDB MySQL版提供的SQL Trace功能,用于跟踪SQL语句的执行信息,如:执行计划和执行统计信息(包括扫描行数、执行时间等)。可以帮助您快速地发现因执行计划变更而引发的性能变化,并统计当前集群中消耗负载较大的TopSQL。
前提条件
PolarDB集群版本需满足以下条件之一:
PolarDB MySQL版8.0.1版本且修订版本为8.0.1.1.30及以上。
PolarDB MySQL版8.0.2版本且修订版本为8.0.2.2.12及以上。
您可以通过查询版本号来确认集群版本。
使用限制
SQL Trace功能不会跟踪与账号相关的操作。如:CREATE USER、DROP USER和GRANT等。
参数说明
参数名称 | 描述 |
loose_sql_trace_type | SQL Trace跟踪类型。取值范围如下:
说明 仅支持在PolarDB MySQL版8.0.1版本,且修订版本为8.0.1.1.34及以上的版本使用SLOW_QUERY。 |
loose_sql_sharing_size | 存储SQL Sharing(SQL Trace中的基础组件)的最大使用内存。 取值范围:8388608~1073741824。单位:字节。默认值为134217728。 |
loose_sql_trace_plan_expire_time | SQL Trace跟踪的执行计划失效时间。当执行计划超过该时间且未被命中后,该执行计划将会被判定为过期,可以将其淘汰。 取值范围:0~18446744073709551615。单位:秒。默认值为604800。 |
使用说明
添加需要跟踪的SQL语句。
您可以通过以下两种方式来添加需要跟踪的SQL语句,并通过SQL Trace功能来跟踪SQL语句的执行信息。
将
loose_sql_trace_type
参数值设置为ALL,来跟踪所有的SQL语句。将
loose_sql_trace_type
参数值设置为DEMAND,通过dbms_sql.add_trace存储过程添加指定的需要跟踪的SQL语句。
获取使用SQL Trace功能跟踪的SQL语句的信息。
您可以通过访问information_schema.sql_sharing表来获取使用SQL Trace功能跟踪的SQL语句的执行信息和TopSQL等。示例如下:
获取指定SQL的执行信息和执行计划信息。
SELECT * FROM information_schema.sql_sharing WHERE sql_id = polar_sql_id('select * from t');
分别获取按照总执行时间、平均执行时间和总扫描行数三个维度Top10的SQL语句。
SELECT * FROM information_schema.sql_sharing WHERE TYPE='sql' ORDER BY SUM_EXEC_TIME DESC LIMIT 10; SELECT * FROM information_schema.sql_sharing WHERE TYPE='sql' ORDER BY SUM_EXEC_TIME/EXECUTIONS DESC LIMIT 10; SELECT * FROM information_schema.sql_sharing WHERE TYPE='sql' ORDER BY SUM_ROWS_EXAMINED DESC LIMIT 10;
其他操作
如果不再需要跟踪通过dbms_sql.add_trace存储过程添加的SQL语句,您可以通过dbms_sql.delete_trace存储过程根据具体的SQL语句来删除模板化的SQL语句,或通过dbms_sql.delete_trace_by_sqlid存储过程根据SQL ID来删除模板化的SQL语句。
您可以通过dbms_sql.reset_trace_stats存储过程来重置information_schema.sql_sharing表中的所有统计信息。
您可以通过dbms_sql.flush_trace存储过程来清理information_schema.sql_sharing表中的所有统计信息。清理完成后,如果需要再次统计通过dbms_sql.add_trace存储过程添加的SQL语句的执行情况,您可以通过dbms_sql.reload_trace存储过程将mysql.sql_sharing表中模板化SQL语句重新导入至information_schema.sql_sharing表中。
性能测试
SQL Trace内部使用了大量的无锁设计,能够保证在高并发、SQL模板数量较多等场景下的数据库性能。
以下测试为相同场景下,sql_trace_type
参数值设置为OFF和ALL时的性能对比。
Sysbench测试数据量为2千张表,每张表1万行数据。集群规格分别为4核8 GB和8核32 GB。
集群规格为4核8 GB时的性能对比如下:
db-ps-mode=disable oltp_read_only
db-ps-mode=auto oltp_read_write
集群规格为8核32 GB时的性能对比如下:
db-ps-mode=disable oltp_read_only
db-ps-mode=auto oltp_read_write
结论
由以上的测试数据得出:在oltp_read_only和oltp_read_write场景下SQL Trace对性能的影响均不超过3%。