TPT写入会话性能问题求助:AS400至Teradata数据加载吞吐量低
解决AS400到Teradata TPT Write低吞吐量问题(6行/秒)
这种慢到离谱的吞吐量在批量加载作业里确实让人抓狂,结合你的场景——182列、1900万条记录、TPT Write截断加载直接映射,我从数据源端、TPT配置、Teradata端、网络四个核心方向给你拆解排查和优化步骤:
一、先排查AS400源端的抽取瓶颈
TPT的速度永远快不过数据源的输出速度,先确认是不是AS400拖了后腿:
- 调整ODBC/FetchSize参数:如果用ODBC连接AS400,默认的FetchSize可能只有100条,意味着每取100条就要和AS400打一次交道。把这个参数调到
10000甚至更高(比如FetchSize=10000),能大幅减少往返次数。 - 单独验证AS400查询性能:直接在AS400上跑你的抽取SQL(
SELECT * FROM 源表),看返回数据的速度。如果这个查询本身就慢,那TPT再优化也没用——检查源表有没有合适的索引?182列全扫大表,AS400的IO压力会很大,要是能加个覆盖索引或者分区键,抽数速度会飙升。 - AS400系统资源检查:抽数期间,AS400的CPU、磁盘IO是不是被其他大作业占满了?找运维查一下当时的系统负载,要是资源不够,先腾地方再跑作业。
二、优化TPT Write的核心配置
TPT的默认配置往往不是最优的,针对你的场景调整这些参数:
- 用FastLoad模式替代普通Write:你是截断加载空表,一定要用TPT的
FASTLOAD算子,而不是普通的INSERT型Write。FastLoad是Teradata专门为批量加载空表设计的,速度能快几个数量级。在脚本里把算子类型设为TYPE FASTLOAD,并指定LoadType='TRUNCATE'。 - 增加并行会话数:默认的
SessionCount可能只有4,根据Teradata的负载情况,调到8-16(比如SessionCount=8),让多个会话并行写入Teradata,提升吞吐量。 - 调大网络数据包大小:把
PacketSize设为65535(最大允许值),减少TPT和Teradata之间的网络交互次数,尤其适合跨机房的场景。 - 关闭不必要的数据验证:如果源数据质量有保障,把
Validate='NO',避免TPT做额外的数据校验消耗CPU。
三、检查Teradata端的负载和表设计
Teradata端的瓶颈也会拖慢加载速度:
- 目标表的索引策略:如果目标表有二级索引,FastLoad会先把数据加载到临时表,再重建索引,这会大幅增加耗时。建议先加载数据,再创建二级索引;如果必须带索引加载,改用
MULTILOAD算子(速度比FastLoad慢,但比普通INSERT快)。 - AMP数据分布:检查目标表的主键/分区键是不是均匀分布数据。如果数据倾斜严重,某个AMP会被压满,其他AMP闲得慌,整体速度就下来了。可以用
SELECT HASHAMP(HASHBUCKET(HASHROW(主键列))) AS AMP, COUNT(*) FROM 目标表 GROUP BY AMP看分布情况。 - Teradata系统负载:加载期间,查一下Teradata的AMP CPU、磁盘IO使用率。如果已经跑满,要么等其他作业结束,要么申请更多资源。另外,开启Teradata的表压缩(
COMPRESS)能减少存储和IO开销,对加载速度也有帮助。
四、网络延迟排查
如果AS400和Teradata跨地域部署,网络延迟是隐形杀手:
- 用
ping或traceroute测试两地的网络延迟,如果延迟超过50ms,小批量传输的开销会非常大——这时候调大FetchSize和PacketSize的效果会更明显。
示例优化后的TPT脚本片段
DEFINE JOB LOAD_AS400_TO_TERADATA DESCRIPTION 'Batch load from AS400 to Teradata with FastLoad' ( DEFINE SCHEMA AS400_SOURCE_SCHEMA ( -- 按实际182列定义字段,保持和AS400源表一致 COL1 VARCHAR(50), COL2 INTEGER, COL3 DATE, -- ... 其余179列 ); DEFINE OPERATOR AS400_EXTRACTOR TYPE DATACONNECTOR PRODUCER SCHEMA AS400_SOURCE_SCHEMA ATTRIBUTES ( VARCHAR DataSourceName = 'YOUR_AS400_ODBC_DSN', VARCHAR UserName = 'AS400_USER', VARCHAR Password = 'AS400_PWD', VARCHAR SelectStmt = 'SELECT * FROM AS400_SOURCE_TABLE', INTEGER FetchSize = 10000, -- 大幅调大FetchSize VARCHAR PrivateLogName = 'AS400_EXTRACT_LOG' ); DEFINE OPERATOR TERADATA_FASTLOADER TYPE FASTLOAD SCHEMA AS400_SOURCE_SCHEMA ATTRIBUTES ( VARCHAR TdpId = 'YOUR_TERADATA_TDP', VARCHAR UserName = 'TD_USER', VARCHAR Password = 'TD_PWD', VARCHAR TargetTable = 'TD_TARGET_TABLE', VARCHAR LoadType = 'TRUNCATE', -- 截断加载 INTEGER SessionCount = 8, -- 增加并行会话 VARCHAR PacketSize = '65535', -- 最大数据包 VARCHAR Validate = 'NO', -- 关闭数据验证 VARCHAR PrivateLogName = 'TD_FASTLOAD_LOG' ); APPLY ('INSERT INTO TD_TARGET_TABLE VALUES (:COL1, :COL2, :COL3, ...)') TO OPERATOR (TERADATA_FASTLOADER) FROM OPERATOR (AS400_EXTRACTOR); );
按这个思路一步步排查,大概率能把吞吐量从6行/秒提升到几万甚至几十万行/秒。
内容的提问来源于stack exchange,提问作者Sameer
相关产品推荐
相关产品推荐

