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.