TeraData项目总结
在物理布局上,Teradata系统主要包括三个部分:处理节点(Node)、用于节点间通信的内部高速互联(InterConnection)和数据存储介质(通常是磁盘阵列)。
图1
图2
其中解析引擎PE(Parsing Engine)是一个虚拟处理器,用于进行客户端和存取模块处理器之间的通讯和交互。
主要的功能包括任务控制(Session Control),SQL语句的解析、优化、查询步骤的生成和分发,并行化预处理和返回查询结果,每个PE最多支持120个Session。如图3
图3
一般来说一个节点对应一个IP,一个节点一般有2个PE, 在Host文件中一般时候会把所有的IP都设置上,连接时会默认从设置的第一个IP连接,如果大家在HOST中第一个都设置同一IP,那就会出现第一个连接不足时,使用节点间通信,将请求传给其他节点,以达到平均负载的功能。而传回结果的时候还是要通过连接的IP传回数据,这样就会产出不必要的网络资源的浪费。可以通过调整HOST中设置的IP的顺序得到解决。
比如host中
192.168.0.1 dbcoop1
192.168.0.2 dbcoop2
…
192.168.0.20 dbcoop20
调整为
192.168.0.20 ..dbcoop1
192.168.0.19..dbcoop2
…
192.168.0.1 dbcoop20
例如:SELECT
HASHAMP(HASHBUCKET(HASHROW(customer_code,report_date))) AS "AMP", COUNT(*)
FROM dwcrssmart.rm_cr_cl_cust_basic_info_t
GROUP BY 1
ORDER BY 1;
查询结果:
AMP Count(*)
0 3,134
1 3,228
2 3,199
3 3,177
4 3,200
....
Ø 避免使用like、substr、index、<>等这类用法,会导致索引失效
Ø 值类型必须与该字段类型相同,否则TERADATA会在内部进行数据转换,将消耗大量的性能。
系统自动获取的临时空间,存放结果集的中间过程和最终的SQL语句执行结果、可变临时表和导出表的数据,不再需要时会自动释放。
查看用户spool空间:
SELECT DATABASENAME (Title 'User')
,sum(MaxSpool) (format '---,---,---,---,--9')(char(19))(title 'max Spool ')
,sum(PeakSpool) (format '---,---,---,---,--9')(char(19))(title 'Peak Spool ')
,sum(Maxtemp) (format '---,---,---,---,--9')(char(19))(title 'max temp ')
,sum(PeakTemp) (format '---,---,---,---,--9')(char(19))(title 'Peak Temp ')
FROM DBC.DISKSPACE
WHERE DatabaseName = 'DWCRSSMART'
ORDER BY 1
GROUP BY 1;
Ø 重分布
将被关联的字段设为PI,计算哈希值,将表数据重新分布到多个AMP中,并做好排序,大大缩减了数据库中进行数据关联的时间。由于原纪录的数量不变,不会增加SPOOL的消耗,但会增加CPU和IO资源的消耗。
Ø 全拷贝
关联字段只在一张表是PI时,两张表的数据分布在不同AMP上,此时第2张表的表数据很小,优化器会优先选择duplicate,将表中所有数据在每个AMP上分别都作一份COPY来替代重分布;
比如2表有100条记录,1表的数据均匀的分布在100个AMP中,结果就是100*100
l Merge Join
MergeJoin中被连接的行必须在同一AMP中,否则TERADATA会根据关联字段进行重分布、复制部分或全部行到同一个AMP。
Ø 如果连接的列是UPI = UPI,则被连接的列在相同AMP中,不需要重分布,速度最快效率最高。
Ø 如果连接的列是UPI = Non Index column,则必须根据与第一个表的关系将第二个表中的记录重新分布到AMP,如果第二个表是小表,则这张表被拷贝到所有AMP上。
Ø 如果连接的列是Non Index column = Non Indexcolumn,则两个表都必须重新分布,使皮匹配的数据位于同一AMP上。由于两个表的完全重新分布遍历所有AMP,
因此这种策略非常耗时。
l Nested Join
Nested Join工作在Join语句中使用的UPI/USI上,并用于从第一个表中检索单条记录。然后从第二个表中根据join中使用的index(primary或secondary)查询出匹配记录并返回匹配结果。
例如:EMPLOYEE表的Enum 是UPI字段。
Select P1.Ename
, P2.Deptno
FROM EMPLOYEE P1
INNER JOIN DEPARTMENT P2
ON P1. EMP.Enum = P2.Enum
Where P1.Enum= 12345;
l ProductJoin
在ProductJoin中,表1查询结果中的每条记录需要匹配表2查询结果的每条记录,某些情况下Product Join是最有效的,但也会消耗大量系统资源。
比较次数=count(表1)*count(表2);
优化器只在右表记录数和导出字段字节数乘积较小的情况下或者关联条件包含非等式关联或者关联条件中带有OR时才选择product join
l Hash Join
Hash Join是Optimizer基于连接条件建议的策略之一。在功能上,HashJoin与MergeJoin紧密相关。MergeJoin中连接发生在同一AMP中。Hash Join中,在同一AMP中的一个或两个表完全在内存中。AMP将小表保持在其内存中用于发生在Row hash上的join。
l Exclusion Join
当查询语句中包含以下关键字时,优化器会建议使用ExclusionJoin:
-NOT IN
-EXCEPT
-MINUS
l 多关联SQL
对于一个左表(主表)同多个右表(维表,关联表)关联时,teradata总是一个一个的关联,即先拿左表同右表1关联生成新的左表,然后再拿新的左表同右表2关联生成新的左表,如此反复,直到右表都关联完毕。此法的效率相当有问题。当左表较大,而右表较小的情况,每做一次关联,就要进行哈希重分布或全拷贝,同时还进行一次表的全扫描,资源浪费较大。而且一次加载过多的数据时,会需要更多的SPOOL空间来存放临时数据。
优化建议:
1.对于左表极大而右表是小表且纪录较多的情况下,通过使用导出表强制优化器使用全拷贝,可以避免左表的重分布和数据分布不均匀,减少了重分布和排序带来的CPU和系统IO的消耗,但是同时又会增加SPOOL空间的消耗。
2.左表较小,右表较大,关联时不是PI=PI,关联条件中存在非等式或OR的情况下,可以将右表使用导出表或临时表,可以避免优化器选择Product Join
例如:dwrdmmart.rdm_cl_ta_adjusted_contract_v表
查看执行计划:优化器选择了Product join
使用导出表
查看执行计划:优化器选择了merge join
3.右边关联表的数量过多,会导致一次加载的数据过多,可能会产生SPOOL空间不足的情况,如果右边的都是小表,可以建立临时表,先将多个很小的右表通过笛卡尔积形成大表(注意控制大表条数,一般控制在千万级效果较佳),然后再将左表同关联好的右表进行关联。
或者将右表使用导出表或临时表的方法,取需要关联的字段和数据,一样可以有效减少SPOOL空间的使用和全表关联的消耗。