跳到主要内容

system_history.query_history

Introduced or updated: v1.2.957
企业版功能
QUERY HISTORY是企业版功能。 如需获取许可证,请联系 Databend 支持团队。

完整的 SQL 执行审计跟踪:记录在 Databend 中执行的所有 SQL 查询(Query)的全面详细信息。每个查询(Query)生成两个条目(开始和结束),提供对以下内容的完全可见性:

  • 性能分析:查询(Query)持续时间、资源使用情况和优化机会
  • 安全审计:谁在何时何地执行了哪些查询(Query)
  • 合规性跟踪:满足监管要求的完整审计跟踪
  • 使用情况监控:数据库活动模式和用户行为分析

凭证脱敏​

query_text 会对可识别的 SQL 凭证值进行脱敏。普通查询字面量仍可能显示。日志中的错误会使用已记录的隐藏值进行清理;返回给提交查询的客户端的错误保持不变。有关范围和限制,请参阅凭证脱敏。这不会清理旧版本已记录的历史数据。

字段​

字段类型描述
log_typeTINYINT查询状态:1=开始,2=完成,3=错误,4=中止,5=关闭。
log_type_nameVARCHAR查询状态的字符串名称:"Start"、"Finish"、"Error"、"Aborted" 或 "Closed"。
handler_typeVARCHAR用于查询的协议或处理程序(例如 HTTPQuery、MySQL)。
tenant_idVARCHAR租户标识符。
cluster_idVARCHAR集群标识符。
node_idVARCHAR节点标识符。
sql_userVARCHAR执行查询的用户。
sql_user_quotaVARCHAR用户的配额信息。
sql_user_privilegesVARCHAR用户的权限。
query_idVARCHAR查询的唯一标识符。
query_kindVARCHAR查询的类型(例如 Query、Insert、CopyIntoTable 等)。
query_textVARCHAR查询的 SQL 文本。
query_hashVARCHAR查询文本的哈希值。
query_parameterized_hashVARCHAR查询的哈希值(忽略具体参数值)。
event_dateDATE事件发生的日期。
event_timeTIMESTAMP事件发生的时间戳。
query_start_timeTIMESTAMP查询开始的时间戳。
query_duration_msBIGINT查询的总持续时间(以毫秒为单位),包括排队时间和执行时间。
query_queued_duration_msBIGINT查询在队列中花费的时间(以毫秒为单位)。
current_databaseVARCHAR执行查询时使用的数据库。
written_rowsBIGINT UNSIGNED查询写入的行数。
written_bytesBIGINT UNSIGNED查询写入的字节数。
join_spilled_rowsBIGINT UNSIGNED连接操作期间溢出的行数。
join_spilled_bytesBIGINT UNSIGNED连接操作期间溢出的字节数。
agg_spilled_rowsBIGINT UNSIGNED聚合操作期间溢出的行数。
agg_spilled_bytesBIGINT UNSIGNED聚合操作期间溢出的字节数。
group_by_spilled_rowsBIGINT UNSIGNED分组操作期间溢出的行数。
group_by_spilled_bytesBIGINT UNSIGNED分组操作期间溢出的字节数。
written_io_bytesBIGINT UNSIGNED归属于查询的存储写入字节数。
written_io_bytes_cost_msBIGINT UNSIGNED累计存储写操作时长,单位为毫秒。
scan_rowsBIGINT UNSIGNED扫描工作量的行数,不是结果行数。请参阅指标范围。
scan_bytesBIGINT UNSIGNED逻辑扫描工作量的字节数,不是存储读取字节数。
scan_io_bytesBIGINT UNSIGNED归属于查询的存储读取字节数,范围不限于扫描输出。
scan_io_bytes_cost_msBIGINT UNSIGNED累计存储读操作时长,单位为毫秒。
scan_partitionsBIGINT UNSIGNED扫描的分区(Partition)数。
total_partitionsBIGINT UNSIGNED涉及的总分区(Partition)数。
result_rowsBIGINT UNSIGNED查询结果中的行数。
result_bytesBIGINT UNSIGNED查询结果中的字节数。
bytes_from_remote_diskBIGINT UNSIGNED从远程磁盘读取的字节数。
bytes_from_local_diskBIGINT UNSIGNED从本地磁盘读取的字节数。
bytes_from_memoryBIGINT UNSIGNED从内存中读取的字节数。
client_addressVARCHAR发起查询的客户端地址。
user_agentVARCHAR客户端的用户代理字符串。
exception_codeINT查询失败时的异常代码。
exception_textVARCHAR查询失败时的异常消息。
server_versionVARCHAR处理查询的服务器版本。
query_tagVARCHAR与查询关联的标签。
has_profileBOOLEAN查询是否关联执行配置文件。
peek_memory_usageVARIANT查询执行期间的峰值内存使用情况(以 JSON 对象表示)。
session_idVARCHAR与查询关联的会话标识符。

指标范围​

从 v1.2.953 开始,存储 I/O 字段使用每查询计数器。scan_io_bytes 和 written_io_bytes 包括本地节点 I/O 和已上报给查询的远程节点增量。对应的时长字段来自同一组计数器。每条日志中的 I/O 字段与 resource_usage 使用同一个快照。时长字段累计操作时间,不是查询的墙钟耗时。

这些计数器度量归属于查询的存储操作,包括数据块和元数据 I/O。它们独立于逻辑扫描/写入进度和结果大小。写入查询可以同时报告读取和写入。例如,INSERT ... SELECT 读取源数据并写入目标数据。这两类字节度量不必相等。

同样从 v1.2.953 开始,FUSE Parquet 扫描在 prewhere 和运行时过滤器移除行之前报告工作量。scan_rows 统计已扫描数据块的行数,即使没有行通过这些过滤器。被裁剪的数据块不会被扫描。scan_bytes 表示这些数据块的未压缩投影列工作量。当行选择下推跳过部分行的解码时,这些行的字节数可以通过估算得到。它不是存储传输字节数的精确计数。

同一扫描工作量也用于 system.processes.scan_progress_read_rows、scan_progress_read_bytes 和 Profile 的 ScanBytes。实时的 system.processes.data_read_bytes 和 data_write_bytes 则使用每查询 I/O 计数器。过滤后的结果更小,本身不表示扫描工作量更少。解释指标时,请比较兼容的查询阶段和版本。

查看已完成查询的度量:

SELECT query_id, scan_rows, scan_bytes, scan_io_bytes,
written_io_bytes, result_rows
FROM system_history.query_history
WHERE log_type = 2
ORDER BY event_time DESC
LIMIT 10;

示例​

使用 query_id 查询特定查询的历史记录

SELECT * FROM system_history.query_history WHERE query_id = '4e1f50a9-bce2-45cc-86e4-c7a36b9b8d43';

*************************** 1. row ***************************
log_type: 2
log_type_name: Finish
handler_type: HTTPQuery
tenant_id: test_tenant
cluster_id: test_cluster
node_id: jxSgvulZFAq1sDckR1bu85
sql_user: root
sql_user_quota: NULL
sql_user_privileges: NULL
query_id: 4e1f50a9-bce2-45cc-86e4-c7a36b9b8d43
query_kind: Query
query_text: SELECT * FROM t
query_hash: cd36a2072e7f9deaa746db7480200944
query_parameterized_hash: cd36a2072e7f9deaa746db7480200944
event_date: 2025-06-12
event_time: 2025-06-12 03:31:35.135987
query_start_time: 2025-06-12 03:31:35.041725
query_duration_ms: 94
query_queued_duration_ms: 0
current_database: default
written_rows: 0
written_bytes: 0
join_spilled_rows: 0
join_spilled_bytes: 0
agg_spilled_rows: 0
agg_spilled_bytes: 0
group_by_spilled_rows: 0
group_by_spilled_bytes: 0
written_io_bytes: 0
written_io_bytes_cost_ms: 0
scan_rows: 1
scan_bytes: 20
scan_io_bytes: 605
scan_io_bytes_cost_ms: 0
scan_partitions: 1
total_partitions: 1
result_rows: 1
result_bytes: 20
bytes_from_remote_disk: 74
bytes_from_local_disk: 0
bytes_from_memory: 0
client_address: 127.0.0.1
user_agent: bendsql/0.26.2-unknown
exception_code: 0
exception_text:
server_version: v1.2.753-nightly-c3d5fabb79(rust-1.88.0-nightly-2025-06-12T01:48:36.733925000Z)
query_tag:
has_profile: NULL
peek_memory_usage: {"jxSgvulZFAq1sDckR1bu85":223840}
session_id: e3c54c32-f3c0-4ea9-bdd2-65701aa3f2a6
欢迎体验 Databend Cloud

基于 Rust + 对象存储构建的新一代多模态数仓,一个平台即可进行 BI、向量、全文检索及地理空间分析。

支持标准 SQL,自动弹性伸缩,助您快速构建现代化数据平台。

注册即领 ¥200 代金券。

注册体验