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%。