EXPLAIN 语句
显示语句的执行计划。
语法:
示例:
EXPLAIN 类型
AST— 抽象语法树。SYNTAX— 在 AST 层级优化后的查询文本。QUERY TREE— 在查询树层级优化后的查询树。PLAN— 查询执行计划。PIPELINE— 查询执行管道。
EXPLAIN AST
转储查询 AST。支持所有类型的查询,不仅限于 SELECT。
示例:
EXPLAIN SYNTAX
显示查询的抽象语法树(AST),在语法分析之后。
它通过解析查询,构造查询 AST 和查询树,选择性地运行查询分析器和优化过程,然后将查询树转换回查询 AST。
设置:
oneline– 以一行打印查询。默认:0。run_query_tree_passes– 在转储查询树之前运行查询树过程。默认:0。query_tree_passes– 如果设置了run_query_tree_passes,指定要运行多少次过程。未指定query_tree_passes时,将运行所有过程。
示例:
输出:
带有 run_query_tree_passes:
输出:
EXPLAIN QUERY TREE
设置:
run_passes— 在转储查询树之前运行所有查询树过程。默认:1。dump_passes— 在转储查询树之前转储所用过程的信息。默认:0。passes— 指定要运行多少次过程。如果设置为-1,则运行所有过程。默认:-1。dump_tree— 显示查询树。默认:1。dump_ast— 显示从查询树生成的查询 AST。默认:0。
示例:
EXPLAIN PLAN
转储查询计划步骤。
设置:
header— 打印步骤的输出头部。默认: 0。description— 打印步骤描述。默认: 1。indexes— 显示使用的索引,过滤的部分数量以及每个应用的索引过滤的粒度数量。默认: 0。支持 MergeTree 表。projections— 显示所有分析的投影及其对基于投影主键条件的部分级过滤的影响。对于每个投影,此部分包括统计信息,如评估使用投影主键的部分数量、行数、标记和范围。它还显示由于此过滤而跳过的多少数据部分,而无需从投影本身读取。投影是否实际用于读取或仅用于过滤分析可以通过description字段判断。默认: 0。支持 MergeTree 表。actions— 打印关于步骤动作的详细信息。默认: 0。json— 以 JSON 格式打印查询计划步骤。默认: 0。建议使用 TSVRaw 格式以避免不必要的转义。
当 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 键。它包含一个分析的投影数组。每个投影描述为 JSON,具有以下键:
Name— 投影名称。Condition— 使用的投影主键条件。Description— 投影使用的描述(例如,部分级过滤)。Selected Parts— 被投影选择的部分数量。Selected Marks— 被选择的标记数量。Selected Ranges— 被选择的范围数量。Selected Rows— 被选择的行数量。Filtered Parts— 由于部分级过滤而跳过的部分数量。
示例:
当 actions = 1 时,添加的键根据步骤类型不同而有所不同。
示例:
EXPLAIN PIPELINE
设置:
header— 为每个输出端口打印头。默认: 0。graph— 打印用 DOT 图形描述语言描述的图形。默认: 0。compact— 如果启用graph设置,则以紧凑模式打印图形。默认: 1。
当 compact=0 且 graph=1 时,处理器名称将包含一个附加后缀,标识唯一的处理器标识符。
示例:
EXPLAIN ESTIMATE
显示在处理查询时要从表中读取的估算行数、标记和部分数量。适用于 MergeTree 类型的表。
示例
创建表:
查询:
结果:
EXPLAIN TABLE OVERRIDE
显示通过表函数访问的表模式中的表覆盖结果。 还进行了一些验证,如果覆盖会导致某种类型的失败,将抛出异常。
示例
假设您有一个远程 MySQL 表,如下所示:
结果:
验证并不完整,因此成功的查询并不保证覆盖不会引发问题。