Teradata - 解释



EXPLAIN 命令以英文返回解析引擎的执行计划。它可以与除另一个 EXPLAIN 命令之外的任何 SQL 语句一起使用。当查询前面带有 EXPLAIN 命令时,解析引擎的执行计划将返回给用户,而不是 AMP。

EXPLAIN 示例

考虑具有以下定义的 Employee 表。

CREATE SET TABLE EMPLOYEE,FALLBACK ( 
   EmployeeNo INTEGER, 
   FirstName VARCHAR(30), 
   LastName VARCHAR(30),
   DOB DATE FORMAT 'YYYY-MM-DD', 
   JoinedDate DATE FORMAT 'YYYY-MM-DD', 
   DepartmentNo BYTEINT 
) 
UNIQUE PRIMARY INDEX ( EmployeeNo );

下面给出了一些 EXPLAIN 计划的示例。

全表扫描 (FTS)

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

示例

以下是一个示例查询,其中优化器可能会选择 FTS。

EXPLAIN SELECT * FROM employee;

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

1) First, we lock a distinct TDUSER."pseudo table" for read on a 
   RowHash to prevent global deadlock for TDUSER.employee.  
2) Next, we lock TDUSER.employee for 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), which is 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 操作。

EXPLAIN SELECT * FROM employee WHERE EmployeeNo = 101;

执行上述查询时,会生成以下输出。可以看出,这是一个单 AMP 检索,并且优化器正在使用唯一主键索引来访问该行。

1) First, we do a single-AMP RETRIEVE step from TDUSER.employee by 
   way of the unique primary index "TDUSER.employee.EmployeeNo = 101" 
   with no residual conditions. The estimated time for this step is 
   0.01 seconds.  
→ 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 表。

CREATE SET TABLE SALARY,FALLBACK ( 
   EmployeeNo INTEGER, 
   Gross INTEGER, 
   Deduction INTEGER, 
   NetPay INTEGER 
)
PRIMARY INDEX ( EmployeeNo ) 
UNIQUE INDEX (EmployeeNo);

考虑以下 SELECT 语句。

EXPLAIN SELECT * FROM Salary WHERE EmployeeNo = 101;

执行上述查询时,会生成以下输出。可以看出,优化器使用唯一二级索引在两个 AMP 操作中检索该行。

1) First, we do a two-AMP RETRIEVE step from TDUSER.Salary 
   by way of unique index # 4 "TDUSER.Salary.EmployeeNo = 
   101" with no residual conditions.  The estimated time for this 
   step is 0.01 seconds.  
→ The row is sent directly back to the user as the result of 
   statement 1.  The total estimated time is 0.01 seconds.

其他术语

以下是 EXPLAIN 计划中常见的术语列表。

…(最后使用)…

当此步骤完成时,不再需要暂存文件,并且将释放。

…没有剩余条件…

所有适用的条件都已应用于行。

…结束事务…

释放事务锁,并提交更改。

…消除重复行…

重复行仅存在于暂存文件中,而不存在于集合表中。执行 DISTINCT 操作。

…通过遍历索引#n仅提取行 ID…

构建一个包含在二级索引(索引#n)中找到的行 ID 的暂存文件。

…我们执行 SMS(集合操作步骤)…

使用 UNION、MINUS 或 INTERSECT 运算符组合行。

…它通过哈希码重新分布到所有 AMP。

重新分布数据以准备连接。

…它在所有 AMP 上都进行了复制。

复制来自较小表(在 SPOOL 方面)的数据以准备连接。

…(one_AMP)或(group_AMPs)

指示将使用一个 AMP 或 AMP 子集而不是所有 AMP。

广告