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)首先,我们锁定一个不同的TDUSER.伪表"用于读取
 RowHash以防止TDUSER.employee的全局死锁. 
 2)接下来,我们锁定TDUSER.employee进行读取. 
 3)我们通过
全行扫描从TDUSER.employee执行全AMPs RETRIEVE步骤,没有残留条件进入Spool 1 
(group_amps),这是在本地构建的AMP. 
假脱机1的大小估计为低置信度为2行(116字节). 
此步骤的预计时间为0.03秒. 
 4)最后,我们向处理请求的所有涉及
的AMP发送END TRANSACTION步骤. 
 → 作为
语句1的结果,假脱机1的内容被发送回用户.总估计时间是0.03秒.

唯一主索引

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

EXPLAIN SELECT * FROM employee WHERE EmployeeNo = 101;

执行上述查询时,会产生以下输出.可以看出,它是单AMP检索,优化器使用唯一的主索引来访问该行.

 
 1)首先,我们从TDUSER.employee执行单一AMP RETRIEVE步骤,以
的方式获得唯一主索引"TDUSER.employee.EmployeeNo = 101"
,没有剩余条件.此步骤的预计时间为
 0.01秒. 
 → 作为
语句1的结果,该行直接发送回用户.总估计时间为0.01秒.

唯一二级索引

使用唯一二级索引访问行时,它是两个放大器操作.

示例

考虑具有以下定义的表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;

执行上述查询时,会产生以下输出.可以看出,优化器使用唯一的二级索引检索两个放大器操作中的行.

 
 1)首先,我们进行双AMP检索从TDUSER.Salary 
开始,通过唯一索引#4"TDUSER.Salary.EmployeeNo = 
 101",没有剩余条件.这个
步骤的估计时间是0.01秒. 
 → 作为
语句1的结果,该行直接发送回用户.总估计时间为0.01秒.

附加条款

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

...(上次使用)...

不再需要假脱机文件在此步骤完成时释放.

...没有剩余条件......

所有适用的条件都适用于行.

... END TRANSACTION ...

已释放事务锁定,并且已提交更改.

...消除重复行...

重复行仅存在于假脱机文件中,而不是设置表.执行DISTINCT操作.

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

构建一个假脱机文件,其中包含在二级索引中找到的行ID(索引编号为#n)

...我们这样做SMS(设置操作步骤)...

使用UNION,MINUS或INTERSECT运算符组合行.

...通过哈希码重新分配给所有AMP.

重新分发准备加入的数据.

...在所有AMP上重复.

从较小的表中复制数据(就SPOOL而言)以准备连接.

...(one_AMP)或(group_AMPs)

表示将使用一个AMP或AMP子集代替所有AMP.