teradata - MLOAD 是在单个事务中执行的吗?

标签 teradata mload

我有一个 MLOAD 作业,它将数据从 Oracle 数据库插入到 Teradata 数据库中。它所做的事情之一是删除目标表并重新创建它。我们的生产网站根据目标表中的内容填充下拉列表。

如果 MLOAD 脚本不在单个事务上,则在 MLOAD 作业期间发生绑定(bind)时,下拉列表可能无法正确填充。但是,如果它是事务性的,那么这将是一个无缝过程,因为只有在提交事务后更改才会显示。

运行 MLOAD 作业后,我检查了 dbc.DBQLogTbldbc.DBQLQryLogsql View ,作业中似乎发生了多个事务,因此看起来整个工作不是在单个事务中完成的。不过,我想在做出假设之前先验证一下情况是否确实如此。

最佳答案

Teradata 中的事务不能包含多个 DDL 语句,每个 DDL 必须单独提交。

即使您在 DBQL 中看到多个事务,MLoad 在逻辑上也被视为单个事务,这些是准备和清理的步骤。

当您的应用程序尝试从目标表中进行选择时,一切都会正常(除非它使用 LOCKING ROW FOR ACCESS 进行脏读)。

顺便说一句,当应用程序尝试选择时,可能会出现另一条错误消息“表不存在”。为什么要删除/重新创建表而不是简单的删除?

另一个解决方案是加载表的副本并使用 View 切换:

mload tab2;
replace view v as select * from tab2;
delete from tab1;

下一次加载即可:

mload tab1;
replace view v as select * from tab1;
delete from tab2;

等等。当然,您的加载作业需要实现切换逻辑。

关于teradata - MLOAD 是在单个事务中执行的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22149765/

相关文章:

python - 有没有办法将 pandas 数据帧存储到 Teradata 表

c - TeraData 中的 IRR(内部 yield )UDF

sql - Teradata SQL 中的多个连接 - 更快地使用子查询或临时表?

sql - 查询 2 年并排除 1

python - 通过 SQLAlchemy 执行 Teradata MERGE 时不会产生任何结果