0

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

.jcall(ps, "[I", "executeBatch") 中的错误:
java.sql.BatchUpdateException: [Teradata JDBC Driver] [TeraJDBC 15.10.00.22] [Error 1338] [SQLState HY000] 执行 PreparedStatement 批处理时发生故障要求。可以在使用 getNextException 访问的异常链中找到失败的详细信息。

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

知道这是Error 1338什么,有什么可以解决的吗?此外,它提到getNextException但我如何将它与 R 一起使用?

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

4

3 回答 3

0

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

有关完整示例,请参阅teradata 开发人员论坛上的此链接。

批量插入期间异常的典型原因是:

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

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

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

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

于 2016-09-15T08:50:46.287 回答
0

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

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

于 2020-09-28T19:51:45.500 回答
0

这里的注释很少。

  1. 第一个是GC。这在通常的 java 程序中不是问题,但是在数百万条记录的负载下,最终尝试Thread.sleep用几秒钟完成。这将触发 GC。我在 Teradata JDBC 驱动程序版本中发现了一些竞争条件17.00.00.03。出于性能目的,它正在重用对要收集的东西的弱引用的旧对象。在使用 fastload™ 或 multiload™ 负载时,这一点变得至关重要。
  2. 确保您的数据库中有足够的空间。这也会导致此异常。
于 2021-11-18T20:44:05.103 回答