Teradata高级文档
Tera Blog 收藏
Teradata SQL调优
1.优化过程:依照运行时间,数据量和复杂度来定位瓶颈。
查看sql执行计划,判断其合理性。 性能监控 ==》目标选取 ==》性能分析 ==》过程优化 ==》运行跟踪(性能监控)
注意:每个过程中都会产生必须的文档
2.性能分析: ? Review PDM --表定义 --PI的选择 --表的记录数与空间占用 ? Review SQL --关联的表 --逻辑处理复杂度 --整体逻辑 --多余的处理 ? 测试运行 --响应时间 ? 查看EXPLAIN --瓶颈定位
3.过程优化: ? 业务规则理解 --合理选取数据访问路径 ? PDM设计 --调整PDM ? SQL写法不优化,忽略了Teradata的机理与特性 --调整SQL ? Teradata优化器未得到足够的统计信息 --Collect Statistics
4.Multiple Insert/select --> Multi-Statement Insert/Select * 并行插入空表不记录Transient Journal * 充分利用Teradata向空表Insert较快以及并行操作的特性如: ? 现状 INSERT INTO ${TARGETDB}.DES (Party_Id ,Party_Name ... ) SELECT … FROM SRC1 ; INSERT INTO ${TARGETDB}.DES (Party_Id ,Party_Name ... ) SELECT … FROM SRC2 ; INSERT INTO ${TARGETDB}.DES (Party_Id ,Party_Name ... ) SELECT … FROM SRC3 ; 说明:串行执行,多个Transaction ? 优化后: INSERT INTO ${TARGETDB}.DES (Party_Id ,Party_Name ... ) SELECT … FROM SRC1 ;INSERT INTO ${TARGETDB}.DES (Party_Id ,Party_Name ... ) SELECT … FROM SRC2 ;INSERT INTO ${TARGETDB}.DES (Party_Id ,Party_Name ... ) SELECT … FROM SRC3 ; 说明:并行执行,单个Transaction
5.Insert/Select with Union/Union all --> Multi-Statement Insert/Select * Union 需要排除重复记录,Union all虽不需要排重,但都需要占用大量的Spool空间,都需要进行重新组织数据 如:现状: INSERT INTO ${TARGETDB}.DES (Party_Id ,Party_Name ... ) SELECT … FROM SRC1 ; UNION ALL SELECT … FROM SRC2 ; UNION ALL SELECT … FROM SRC3 ; … 调整后: INSERT INTO ${TARGETDB}.DES (Party_Id ,Party_Name ... ) SELECT … FROM SRC1 ;INSERT INTO ${TARGETDB}.T01_DES (Party_Id ,Party_Name ... ) SELECT … FROM SRC2 ;INSERT INTO ${TARGETDB}.T01_DES (Party_Id ,Party_Name ... ) SELECT … FROM SRC3 ;
6.排除重复记录 * 针对单表内的重复记录使用ROW_ NUMBER函数排重 * 排重方式多了一层子查询 * 增加了大量的数据重新分布的时间 现状: …… INSERT INTO ${TARGETDB}.T01_INDIV (Party_Id ,Party_Name ... ) SELECT COALESCE(b1.Party_Id,'-1') , COALESCE(TRIM(b1.Party_name),'') ... FROM ( select party_id party_name, … , ROW_NUMBER() OVER (PARTITION BY Party_Id ORDER BY Party_Name ) as rownum from ${TEMPDB}.T01_INDIV b1 … ) AA where AA.rownum = 1 …… 建议做法: INSERT INTO ${TEMPDB}.T01_INDIV … INSERT INTO ${TE