性能分析
system.query_log
表
简介
-
此表包含已执行查询的相关信息,例如:开始时间、处理持续时间、错误消息。
-
您可以更改query_log的设置,在服务器配置的 query_log 部分。
-
您可以通过设置 log_queries=0来禁用query_log. 我们不建议关闭此日志,因为此表中的信息对于解决问题很重要。
-
数据刷新的周期可通过
flush_interval_milliseconds
参数来设置 query_log 。 要强制刷新,请使用 SYSTEM FLUSH LOGS。 -
ClickHouse不会自动从表中删除数据。更多详情请看 introduction 。
-
system.query_log 表注册两种查询:
- 客户端直接运行的初始查询。
- 由其他查询启动的子查询(用于分布式查询执行)。 对于这些类型的查询,有关父查询的信息显示在 initial_* 列。
- 每个查询在query_log 表中创建一或两行记录,这取决于查询的状态(见 type 列):
如果查询执行成功,会创建type分别为QueryStart 和 QueryFinish 的两行记录。
如果在查询处理过程中发生错误,会创建type分别为QueryStart 和 ExceptionWhileProcessing 的两行记录。
如果在启动查询之前发生错误,则创建一行type为ExceptionBeforeStart 的记录。
最佳实践: 性能分析SQL
select
-- *
type, query_kind, event_time , event_date , query_duration_ms
-- read_rows : 从参与了查询的所有表和表函数读取的总行数
-- result_rows : SELECT 查询结果的行数,或INSERT 的行数
, query, is_initial_query, http_method, query_id, read_rows, result_rows, memory_usage
, databases , tables , columns
from system.query_log -- select * from system.query_log
where 1=1
and event_date = '2024-11-14'
-- and query_start_time >= '2024-11-06 00:00:00'
and arrayExists(x -> coalesce(x, '') = 'bdp_test.dwd_vehicle_status_record_ri_d', `tables`) > 0
and is_initial_query in ( 1 ) -- 1:客户端发起的查询 / 0 : 由另一个查询发起的,作为分布式查询的一部分
and http_method in (0 , 1, 2) -- 发起查询的HTTP方法 | 0:TCP / 1:GET / 2:POST
-- 执行查询时的事件类型
-- QueryStart = 1 : 查询成功启动 / 'QueryFinish' = 2 : 查询成功完成 / 'ExceptionBeforeStart' = 3 : 查询执行前有异常 / 'ExceptionWhileProcessing' = 4 — 查询执行期间有异常
-- and type = 2
-- and query_kind in ( 'Insert', 'Select', 'Alter' )
order by event_date desc, query_duration_ms desc
-- limit 50