java - 合并时如何避免 hsqldb 中的 OOM?

标签 java sql merge hsqldb

我有两个表,其中第一个表非常大(>50M 行):

CREATE CACHED TABLE Alldistances (
    word1 VARCHAR(70), 
    word2 VARCHAR(70), 
    distance INTEGER, 
    distcount INTEGER
);

第二个也可能很大(>5M 行):

CREATE CACHED TABLE tempcach (
    word1 VARCHAR(70), 
    word2 VARCHAR(70), 
    distance INTEGER, 
    distcount INTEGER
);

两个表都有索引:

CREATE INDEX mulalldis ON Alldistances (word1, word2, distance);
CREATE INDEX multem ON tempcach (word1, word2, distance);

在我的 java 程序中,我使用准备好的语句来填充/预组织 tempcach 表中的数据,然后将表合并到所有距离:

MERGE INTO Alldistances alld USING ( 

    SELECT word1, 
           word2, 
           distance, 
           distcount FROM tempcach 

    ) AS src (

        newword1, 
        newword2, 
        newdistance, 
        newcount

    ) ON (

            alld.word1 = src.newword1 
        AND alld.word2 = src.newword2 
        AND alld.distance = src.newdistance 

    ) WHEN MATCHED THEN 

        UPDATE SET alld.distcount = alld.distcount+src.newcount 

    WHEN NOT MATCHED THEN 

        INSERT (

            word1, 
            word2, 
            distance, 
            distcount

        ) VALUES (

            newword1, 
            newword2, 
            newdistance, 
            newcount
        );

然后删除或截断 tempchach 表并用新数据填充。 在合并过程中,我得到了 OOM,我猜这是因为整个表在合并过程中被加载到内存中。所以我必须批量合并,但是我可以在 SQL 中执行此操作还是在我的 java 程序中执行此操作。或者是否有一种聪明的方法可以在合并时避免 OOM?

最佳答案

可以在 SQL 中分块(批量)合并。你需要

  • 限制每个 block 中临时表的行数
  • 删除相同的行
  • 重复

SELECT 语句应使用 ORDER BY 和 LIMIT

SELECT word1, 
       word2, 
       distance, 
       distcount FROM tempcach
       ORDER BY primary key or unique columns 
       LIMIT 1000

) AS src (

合并后,删除语句会选择相同的行进行删除

DELETE FROM tempcach WHERE primary key or unique columns IN
      (SELECT primary key or unique columns FROM tempcach 
       ORDER BY primary key or unique columns LIMIT 1000)

关于java - 合并时如何避免 hsqldb 中的 OOM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15327075/

相关文章:

java - 多个面板 - 如何将按钮从一个类链接到另一个类?

java - 如何修复 'Unchecked cast from MyClass to T'

mysql - 获取每组中元素之间的最小差异

java - 合并两个排序列表,但我的头没有更新 - Java

r - 在 R 中使用 Merge 组合 2 个聚合

Java:从服务器而不是系统时钟获取当前日期和时间

java - Spring 正常关闭 - 请求方法不支持

c# - 合并两个 IEnumerable<T>

MySQL - LIKE 尾随通配符与范围搜索

mysql - 在 UNION 之后保留 ORDER BY