本文介绍如何在慢查询表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:332020-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