java - 通过 Java 将超大数据集加载到关系数据库的最佳实践

标签 java sql jdbc sybase

虽然我过去曾处理过大型数据集,但从未处理过如此庞大的数据集。这是分割:

  • 每个月我都会收到一个 5GB 的平面文件,每行包含 1 条数据库记录
  • 此文件包含大约 1000 万行数据,随后的每个月包含的数据都比前一个月多
  • 数据可能有需要忽略的完全重复
  • 数据也可能存在不精确的重复,需要分析,只插入其中一行,其余丢弃

我需要为 10 年的数据设置初始加载,大约有 15 亿行。我对处理此问题的数据库没有问题,但我无法快速加载此数据。

我目前一次插入一行,允许主键约束让我知道是否有一行需要查看,这些行放在单独的表中。

加载一个 5GB 的文件大约需要 10 个小时,这是我所能达到的最快速度。我将其设置为一次预处理大约 25,000 行,然后我通过一个语句遍历它们,如下所示:

public void saveBatchSql(String[] sql) {
    try {
        Statement stmt = dbCon.createStatement();

        for (String query : sql) {
            try {
                stmt.execute(query);
            }
            catch (Exception ee) {
                query = query.replace("component_detail", "component_detail_duplicate");
                stmt.execute(query);
            }
        }

        stmt.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }

}

到目前为止,这是我能想到的最好的。有没有人对如何使它更快地工作有任何想法?据我所知,我无法处理内存中的所有记录,但也许还有其他方法?

顺便说一句,我加载到的数据库是 Sybase 版本 16。

最佳答案

这取决于数据库,但通常推荐的方法是使用数据库工具从 CSV 等简单格式加载数据。根据数据库的不同,您可能需要在导入前删除索引并在导入后重新创建它们。数据库文档通常会提供一些关于如何提高批量数据加载性能的提示。

我建议不要使用 Java 进行批量加载。有什么用?

只是为了加载?数据库工具为此进行了优化,您将无法在 Java 中做得更好。

加载时的数据处理?好吧,通常您可以在数据库中使用 SQL 完成大部分数据处理。因此,将数据加载到传入表中并对其运行 SQL 查询。与 Java 中的硬编码处理逻辑相比,它更加灵活。在大多数情况下,它也会更高效,因为数据库在优化 SQL 查询/语句方面非常聪明。

关于java - 通过 Java 将超大数据集加载到关系数据库的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50308341/

相关文章:

php - 查询具有多个值的多个元键的 Wordpress 帖子

java - 多个数组的公共(public)元素但不使用列表

java - java中的ruby block 相当于什么

java - 比较两个列表的字谜 - Java

sql - PostgreSQL:在 timestamp::DATE 上创建索引

sql - 返回一个表中的所有行,并与另一个表中的行的子集匹配?

java - 带有 PKI 的 Oracle

mysql - 我无法连接到 MySQL 数据库

java - 将java连接到数据库以制作登录表单

java - 当字符串输入包含引号时MySQL语法错误