Teradata Explain

17 Mar 2025 | 6 分钟阅读

EXPLAIN 命令是解析引擎 (PE) 对 AMP 的计划。EXPLAIN 命令以英文翻译形式返回解析引擎的执行计划。它可用于任何 SQL 语句,但不能用于另一个 EXPLAIN 命令。

当查询前置 EXPLAIN 命令时,解析引擎的执行计划将返回给用户,而不是 AMP。Explain 计划可以清晰地展示优化器将如何执行查询。

Teradata 系统中运行新开发的查询之前,最好先分析一下 explain 计划。

explain 计划可以通过两种方式获得。首先,在任何查询前添加 "EXPLAIN" 关键字,其次只需从键盘上按 "F6" 即可。

Explain 计划有助于分析查询的性能问题,因为它将任何复杂的查询分解到最低级别。Explain 计划提供了大量信息,例如

  • 访问路径:如果使用全表扫描或使用任何索引(如主索引路径、辅助索引路径或任何其他索引)来获取数据。
  • 置信度:如果优化器可以使用统计信息或缺少任何统计信息。
  • 联接信息:将要发生什么样的联接。
  • 时间估计:提供估计的查询完成时间。

如果我们在查询语句前加上 explain 命令,或者只按 F6 键,优化器会向用户传递以下估计置信度消息,例如

  • 高置信度:索引或列上可用的统计信息。
  • 低置信度:索引的随机抽样,或统计信息可用,但存在 AND/OR 条件。
  • 无置信度:基于 AMP 行数的随机抽样。未收集统计信息。

Explain 计划关键字

为了理解 EXPLAIN 计划,我们应该知道以下关键字。

关键字说明
锁定伪表在符号表上进行串行锁定。每个表都有一个。它用于防止用户之间的死锁情况。
锁定表以这表示已在表上放置了 ACCESS、READ、WRITE 或 EXCLUSIVE 锁。
锁定行以表示在读取或写入的行上放置了 ACCESS、READ 或 WRITE 锁。
执行 ABORT 测试确保此用户未进行事务处理。
所有 AMP 都检索所有 AMP 都在接收 AMP 步骤,并参与提供结果集。
通过全行扫描行在所有 AMP 上按顺序读取。
通过主索引使用主索引列读取行。
通过索引编号使用辅助索引读取行:来自 HELP INDEX 的数字。
BMSMS位图集操作步骤,当在 WHERE 子句中引用多个 NUSI 列时,使用替代的直接访问技术。
残余条件WHERE 子句条件,除了联接条件之外。
消除重复行提供唯一值通常会导致 DISTINCT、GROUP BY 或子查询。
其中将忽略未知比较这表示 NULL 值不会与 TRUE 或 FALSE 进行比较。在子查询中使用 NOT IN 或 NOT = ALL,因为在被忽略的比较中将不返回任何行。
嵌套联接最快的联接是可能的。它使用 UPI 在使用 UPI 或 USI 在 WHERE 中将联接减少到一行之后检索单行。
合并联接一个表的行在被排序成相同的序列(通常是行哈希)后,在公共域列上与其他表匹配。
产品联接一个表的行与另一个表的所有行匹配,不考虑域匹配。
ROWID 联接非常快的联接。它使用 UPI 的 ROWID 在使用 UPI 或 USI 在 WHERE 中将联接减少到一行之后检索单行。
在所有 AMP 上重复参与联接的表的行在所有 AMPS 上重复。
在所有 AMP 上进行哈希重分布。联接的参与行在联接列上进行哈希处理,并发送到存储要联接的表的匹配行的相同 AMP。
SMS设置操作步骤,INTERSECT、UNION、EXCEPT 或 MINUS 操作的结果。
最后使用此步骤之后不再需要 SPOOL 文件,并释放空间。
在 AMP 上本地构建当行被读取时,它们被放入与 SPOOL 相同的 AMP 上。
本地计算聚合中间结果。聚合值都在同一个 AMP 上,因此无需重新分发它们来处理其他 AMP 上的行。
全局计算聚合中间结果。聚合值并非全部都在同一个 AMP 上,并且必须重新分发到一个 AMP 上,才能与其他 AMP 的相同值一起使用。

EXPLAIN 计划的工作原理

在任何 SQL 请求之前的 EXPLAIN 请求修饰符会使 Teradata 数据库显示该请求的执行计划。请求本身不会被提交执行。

  • 当我们对任何 SQL 请求执行 EXPLAIN 时,该请求将被解析和优化。
  • 优化器生成的访问和联接计划以文本文件的形式返回,该文本文件解释了用于执行请求的(可能并行)步骤。
  • 它还包括完成请求所需的相对成本,考虑到优化器必须使用的统计信息。
  • 如果统计信息不够准确,则成本估算可能不准确。

使用 EXPLAIN 的好处

以下是使用 Explain 计划的一些重要好处,例如

  1. EXPLAIN 有助于评估复杂的查询并开发更有效、更替代的处理策略。
  2. 我们可以通过收集更多列的更多统计信息或定义其他索引来获得更好的计划。
  3. 了解实际的人口统计信息可能允许识别似乎严重错误的行数估算,并帮助查明需要额外统计信息的领域。

EXPLAIN 的示例

考虑定义如下的 Employee 表。

全表扫描 (FTS)

如果在 SELECT 语句中未指定任何条件,则优化器可以使用全表扫描,访问表的每一行。

示例

以下是优化器可以选择 FTS 的一个查询。

当执行上述查询时,它会产生以下输出。可以看出,优化器选择访问所有 AMP 和 AMP 内的所有行。

1. First, we lock a distinct TDUSER."pseudo table" for reading on a RowHash to prevent global deadlock for TDUSER.Employee.  
2. Next, we lock TDUSER.Employee to read.   
3. We do an all-AMPs RETRIEVE step from TDUSER.Employee by way of an all-rows scan with no residual conditions into Spool 1 (group_amps) built locally on the AMPs.  The size of Spool 1 is estimated with low confidence to be 2 rows (116 bytes). The estimated time for this step is 0.03 seconds.
4. Finally, we send out an END TRANSACTION step to all AMPs involved in processing the request. 

//The contents of Spool 1 are sent back to the user as the result of statement 1.
//The total estimated time is 0.03 seconds.

唯一主索引

当使用唯一主索引访问行时,它是一个 AMP 操作。

当执行上述查询时,它会产生单 AMP 检索,优化器使用唯一主索引访问行。

1. First, we do a single-AMP RETRIEVE step from TDUSER.Employee by way of the unique primary index "TDUSER.Employee.Employee_Id = 1001" with no residual conditions.  

//The row is sent directly back to the user as the result of statement 1.  
//The total estimated time is 0.01 seconds.

唯一辅助索引

当使用唯一辅助索引访问行时,它是一个双 AMP 操作。

示例

考虑定义如下的 Salary 表。

考虑以下 SELECT 语句。

当执行上述查询时,优化器使用唯一辅助索引在两个 AMP 操作中检索行。

1. First, we do a two-AMP RETRIEVE step from TDUSER.Salary by way of unique index # 4 "TDUSER.Salary.Employee_Id = 1001" with no residual conditions.   

//The row is sent directly back to the user as the result of statement 1.  
//The total estimated time is 0.01 seconds.

下一个主题Teradata 联接索引