执行一定数量的批处理后出现 Teradata JDBC 错误 1338

问题描述 投票:0回答:3

我正在尝试使用 R 的

RJDBC
包通过一批 10000 条记录将 380 万条记录插入到包含 14 列的 Teradata 表中。 它总是在插入 380000 条记录后崩溃,即在第 39 批执行时。 这是我得到的错误,

.jcall(ps, "[I", "executeBatch") 中的错误:
java.sql.BatchUpdateException:[Teradata JDBC 驱动程序] [TeraJDBC 15.10.00.22] [错误 1338] [SQLState HY000] 执行PreparedStatement 批处理请求时发生故障。失败的详细信息 可以在可访问的异常链中找到 获取下一个异常。

我尝试更改为同一数据帧中的一组不同的行。并且,行为保持不变,在第 39 批执行时崩溃。

知道这是什么

Error 1338
以及可以解决什么问题吗? 另外,它提到了
getNextException
但我如何将它与 R 一起使用?

我使用的方法与此类似 https://developer.teradata.com/blog/ulrich/2013/11/a-wider-test-case-on-r-jdbc-fastload

java r jdbc batch-insert rjdbc
3个回答
0
投票

要获取初始异常“对象”,您需要使用 .jgetEx 来获取,然后可以使用其 getNextException 方法来检索根本原因。

请参阅 teradata 开发者论坛上的此链接,了解完整示例。

批量插入过程中出现异常的典型原因是:

  • “值相关”:无效值、数值数据精度过高
  • “大小相关”:插入的行创建“数据库中没有更多空间”错误

既然您说您已经测试了不同的数据集,并且它们在同一执行中都失败了,那么这很可能是“数据库中没有更多空间”。

但是,这并不一定意味着分配给您的空间已满:可能是表的主索引选择不当(或者数据存在错误,产生重复的主索引) ,导致分布非常偏斜。在这种情况下,如果您可以定义更合适的主索引(或者使用 NOPI 表,如果您将其用作某种阶段表),您将浪费大量可以回收的空间。

在这里您可以找到有关“空间浪费”主题的讨论,其中包含许多有用的查询来诊断问题。


0
投票

同样的情况也发生在我身上,我试图将 2740 万条记录插入到包含 8 列的 Teradata 表中。我在 5.35M 行时遇到同样的错误。

唯一对我有用的是每 1M 条记录进行一次提交。


0
投票

这里的注释很少。

  1. 第一个是GC。这在通常的 java 程序中不是问题,但在数百万条记录的负载下,尝试最终在几秒钟内完成
    Thread.sleep
    。这将触发GC。我在 Teradata JDBC 驱动程序版本
    17.00.00.03
    中发现了一些竞争条件。出于性能目的,它重用旧对象,并弱引用要收集的内容。当使用 fastload™ 或 multiload™ 负载时,这一点变得至关重要。
  2. 确保数据库中有足够的空间。这也会导致这个异常。
© www.soinside.com 2019 - 2024. All rights reserved.