无法理解数十亿行的更新计数 INSERT

Posted

技术标签:

【中文标题】无法理解数十亿行的更新计数 INSERT【英文标题】:Unable to fathom update count INSERT on billions of rows 【发布时间】:2016-05-17 18:05:53 【问题描述】:

我正在运行一个 Netezza SQL 查询,该查询从一个返回近 80 亿行的 select 语句创建一个表。这是查询:

CREATE TABLE
    table1 AS
    (
        SELECT
            column1
        FROM
            table2 qt
        WHERE
           qt.column1 = '2016-04-04'
        UNION ALL
        SELECT
            column1
        FROM
            table3 qt
        WHERE
           qt.column1 = '2016-04-04'
   )

驱动程序抛出此错误:

org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [UNDEFINED]; error code [0];   
    --- The error occurred while applying a parameter map.  
    --- Check the statement (update failed).  
    --- Cause: Unable to fathom update count INSERT 0 7779737732

有人知道这是什么原因吗?

【问题讨论】:

您使用的是什么数据库?您正在运行的 SQL 查询是什么? 也许驱动程序 / db 只处理可以用 32 位或更少位表示的整数,至少在这种情况下是这样。你并没有真正给我们太多的帮助。 @azurefrog 它被标记为 Netezza。我也添加了查询,虽然我不认为它在这种情况下特别有用。 @SnakeDoc,Netazza 提供 64 位整数数据类型并不能保证 JDBC 驱动程序可以处理超过 32 位整数容量的更新计数。此外,尚不清楚错误是由于更新计数大,还是由于 Spring 对该更新计数所做的操作(例如,将其写入辅助表,可能写入类型为(32 位)@987654323 的列@)。 “您的意思是创建一个包含数十亿行的表吗?”。 【参考方案1】:

我认为您遇到了 JDBC 驱动程序限制。如果您通过 JDBC 运行 INSERT、UPDATE、CREATE AS SELECT 并且 INSERT、UPDATEd 或 CREATEd 的行数超过 2147483647,您将收到类似以下的错误消息:

Unable to fathom update count INSERT 0 5120000160

考虑到 INSERT、UPDATE 或 CREATE 作为 SELECT 以及实际受影响的行数,上述错误消息可能会有所不同。这是 JDBC 规范本身的限制。

谢谢, 桑吉特

【讨论】:

以上是关于无法理解数十亿行的更新计数 INSERT的主要内容,如果未能解决你的问题,请参考以下文章

从包含数万亿条记录的 Oracle 表中删除数十亿条记录

从远程服务器检索数十亿行?

如何在超过 100 亿行的海量数据集上执行选择

具有超过十亿行的表的 Postgres 性能

我应该在包含超过十亿行的mysql数据库设计中使用啥方法来使用最少的时间找到特定的值?

每天更新云中 2-30 亿行数据集中的 1 亿行