EXPLAIN 语句
显示语句的执行计划。
语法:
示例:
EXPLAIN 类型
AST— 抽象语法树。SYNTAX— 经过 AST 级优化后的查询文本。QUERY TREE— 经过 Query Tree 级优化后的查询树。PLAN— 查询执行计划。PIPELINE— 查询执行流水线。
EXPLAIN AST
输出查询的 AST。支持所有类型的查询,而不仅仅是 SELECT。
示例:
EXPLAIN SYNTAX
在语法分析之后显示查询的抽象语法树(AST)。
该过程通过解析查询、构建查询 AST 和查询树,可选地运行查询分析器和优化 pass,随后将查询树转换回查询 AST 来完成。
Settings:
oneline– 将查询打印为单行。默认值:0。run_query_tree_passes– 在输出查询树之前运行查询树 passes。默认值:0。query_tree_passes– 如果设置了run_query_tree_passes,指定要运行多少次 pass。如果不指定query_tree_passes,则会运行所有 pass。
Examples:
输出结果:
使用 run_query_tree_passes:
输出结果:
EXPLAIN QUERY TREE
设置:
run_passes— 在转储查询树之前运行所有查询树 passes。默认值:1。dump_passes— 在转储查询树之前转储所使用 passes 的信息。默认值:0。passes— 指定要运行多少个 passes。如果设置为-1,则运行所有 passes。默认值:-1。dump_tree— 显示查询树。默认值:1。dump_ast— 显示由查询树生成的查询 AST。默认值:0。
示例:
EXPLAIN PLAN
输出查询计划步骤。
设置:
header— 为每个步骤打印输出头部信息。默认值:0。description— 打印步骤描述。默认值:1。indexes— 显示已使用的索引、每个应用索引过滤的分区片段数量以及过滤的粒度数量。默认值:0。支持 MergeTree 表。从 ClickHouse >= v25.9 开始,仅在与SETTINGS use_query_condition_cache = 0, use_skip_indexes_on_data_read = 0一起使用时,该语句才会输出有意义的结果。projections— 显示所有已分析的投影,以及它们基于投影主键条件在分区片段级别过滤方面的效果。对于每个投影,本部分包含统计信息,例如使用该投影主键进行评估的分区片段、行、标记和范围数量。它还会显示由于该过滤而被跳过的数据分区片段数量,而无需从投影本身读取数据。投影是实际用于读取,还是仅用于过滤分析,可以通过description字段判断。默认值:0。支持 MergeTree 表。actions— 打印关于步骤执行行为的详细信息。默认值:0。json— 以 JSON 格式将查询计划步骤输出为一行。默认值:0。建议使用 TabSeparatedRaw (TSVRaw) 格式以避免不必要的转义。input_headers- 为每个步骤打印输入头部信息。默认值:0。主要仅对开发人员在调试与输入输出头部不匹配相关的问题时有用。column_structure- 除名称和类型外,还打印头部中列的结构信息。默认值:0。主要仅对开发人员在调试与输入输出头部不匹配相关的问题时有用。distributed— 显示在远程节点上针对分布式表或并行副本执行的查询计划。默认值:0。
当 json=1 时,步骤名称将包含一个带有唯一步骤标识符的额外后缀。
示例:
不支持执行步骤和查询代价估算。
当 json = 1 时,查询计划以 JSON 格式表示。每个节点是一个字典对象,并且始终包含键 Node Type 和 Plans。Node Type 是表示步骤名称的字符串。Plans 是一个数组,包含子步骤的描述。根据节点类型和设置,还可以添加其他可选键。
示例:
将 description 设为 1 时,会向该步骤添加 Description 键:
当 header = 1 时,Header 键会作为列数组添加到该步骤中。
示例:
当 indexes = 1 时,会添加 Indexes 键。它包含一个已使用索引的数组。每个索引以 JSON 对象形式描述,具有 Type 键(字符串 MinMax、Partition、PrimaryKey 或 Skip)以及可选键:
Name— 索引名称(目前仅用于Skip索引)。Keys— 索引使用的列数组。Condition— 实际使用的条件。Description— 索引描述(目前仅用于Skip索引)。Parts— 应用索引之前/之后的分区片段数量。Granules— 应用索引之前/之后的粒度数量。Ranges— 应用索引之后的粒度区间数量。
示例:
当 projections = 1 时,会新增 Projections 键。它包含一个已分析 projection 的数组。每个 projection 以 JSON 形式描述,包含以下键:
Name— projection 名称。Condition— 使用的 projection 主键条件。Description— projection 的使用方式说明(例如 part-level 过滤)。Selected Parts— 该 projection 选中的分区片段数量。Selected Marks— 选中的 marks 数量。Selected Ranges— 选中的 ranges 数量。Selected Rows— 选中的行数量。Filtered Parts— 由于 part-level 过滤而被跳过的分区片段数量。
示例:
当 actions = 1 时,添加的键取决于步骤类型。
示例:
当 distributed = 1 时,输出不仅包含本地查询计划,还包含将在远程节点上执行的查询计划。这对于分析和调试分布式查询非常有用。
分布式表示例:
并行副本示例:
在这两个示例中,查询计划显示了整个执行流程,包括本地和远程步骤。
EXPLAIN PIPELINE
设置:
header— 为每个输出端口打印头部信息。默认值:0。graph— 使用 DOT 图描述语言打印图。默认值:0。compact— 当启用graph设置时,以紧凑模式打印图。默认值:1。
当 compact=0 且 graph=1 时,处理器名称会附加一个包含唯一处理器标识符的后缀。
示例:
EXPLAIN ESTIMATE
显示在处理查询时预计将从表中读取的行数、标记数和分区片段数。适用于 MergeTree 系列表。
示例
创建一个表:
查询:
结果:
EXPLAIN TABLE OVERRIDE
显示通过 table function 访问的表,在应用 table override 之后的表结构结果。
同时会执行一些校验,如果该 override 会导致某种失败,则会抛出异常。
示例
假设你有一个远程的 MySQL 表,如下所示:
结果:
验证尚未完成,因此即便查询成功,也不能保证此 override 不会引发问题。