本文介绍如何在慢查询表information_schema.kepler_slow_sql_merged上执行查询语句,从而对慢SQL进行初步的原因定位,或者查找消耗资源(例如CPU或内存)较大的bad SQL。
简介
慢查询表information_schema.kepler_slow_sql_merged记录了在AnalyticDB (ADB) 中执行的SQL语句耗时大于1秒(默认时间)时的部分统计信息。如果要修改默认时间,请提交工单处理。
慢查询表及其详情信息保存在前端节点的本地磁盘文件中,该表存储的慢SQL个数根据用户的集群规模或者SQL复杂度而不同。集群规模越大或者SQL越复杂,需要保存的信息也越多,相应地保存的慢SQL个数也越少。您可以对该表执行count查看慢SQL个数或者执行min(start_time)来确定保存的慢SQL的最早时间。
常用字段说明
字段 | 说明 |
---|---|
start_time | 查询的提交时间。 |
time | 查询的总耗时。单位为ms。 |
user | 提交查询的用户名。 |
db | 建立连接的数据库名称。 |
peak_mem | 查询的峰值内存。单位为byte。可用于判断消耗内存资源较多的SQL。 |
state | 查询状态。其值为SUCCESS或者FAILED。 |
scan_rows | 从数据源表扫描的行数。可用于判断某条SQL是否扫描了大量数据。 |
scan_size | 从数据源表扫描的数据量。单位为byte。 |
scan_time | 从底层存储扫描数据消耗的时间累加值。单位为ms。可用于初步判断过滤条件是否合适、过滤条件是否下推、索引是否生效等。 |
return_row_counts | 查询输出的总行数。可用于判断一条查询最终总的输出量。 |
planning_time | 查询在ADB的优化器中进行最优执行计划计算的耗时。单位为ms。 |
wall_time | 执行一条SQL时使用的物理算子消耗的CPU时间总和。可用来判断计算量较大的SQL。单位为ms。 |
sql | 用户提交的SQL语句。 |
queued_time | 查询的排队时间。单位为ms。 |
access_ip | 查询提交使用的客户端IP地址。 |
常用的查询
- 查看某个时段的内存、扫描行数、扫描数据量、相关SQL、耗时以及提交时间
SQL模版
SELECT peak_mem, scan_rows, scan_size, sql, time, start_time FROM information_schema.kepler_slow_sql_merged WHERE start_time > ${timeStart} AND start_time < ${timeEnd}
SQL示例
查找提交时间在
2020-09-16 01:41:33
和2020-09-16 02:41:33
这一小时之内的SQL:SELECT peak_mem, scan_rows, scan_size, sql, time, start_time FROM information_schema.kepler_slow_sql_merged WHERE start_time > '2020-09-16 01:41:33' AND start_time < '2020-09-16 02:41:33'
- 根据SQL条件模糊查询内存、扫描行数、扫描数据量、耗时以及提交时间
SELECT peak_mem, scan_rows, scan_size, time, start_time FROM information_schema.kepler_slow_sql_merged WHERE sql LIKE '%date_test%'
- 根据耗时条件查询某个时段的SQL情况
SQL模板
SELECT peak_mem, scan_rows, scan_size, time, start_time, sql FROM information_schema.kepler_slow_sql_merged WHERE time > ${min_time} AND time < ${max_time}
SQL示例
SELECT peak_mem, scan_rows, scan_size, time, start_time, sql FROM information_schema.kepler_slow_sql_merged WHERE time > 20*1000 AND time < 30*1000
- 根据
peak_mem
字段查询内存消耗在某个范围内的SQL情况SQL模板
SELECT peak_mem, scan_rows, scan_size, time, start_time, sql FROM information_schema.kepler_slow_sql_merged WHERE peak_mem > ${min_memory} AND peak_mem < ${max_memory}
SQL示例
SELECT peak_mem, scan_rows, scan_size, time, start_time, sql FROM information_schema.kepler_slow_sql_merged WHERE peak_mem > 1 * 1024 * 1024 * 1024 AND peak_mem < 10 * 1024 * 1024 * 1024
- 根据客户端IP进行聚合分析
根据
access_ip
进行分组聚合,然后根据平均消耗内存最多的access_ip
进行降序排列SELECT max(peak_mem), avg(peak_mem) avg_peak_mem, count(*), max(scan_rows), avg(time), access_ip FROM information_schema.kepler_slow_sql_merged group by access_ip order by avg_peak_mem desc
在文档使用中是否遇到以下问题
更多建议
匿名提交