【发布时间】:2013-02-25 22:48:10
【问题描述】:
我有两个表,其中第一个非常大(>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?
【问题讨论】:
-
50kk 是 50,000 (50K) 还是 50,000,000 (50M) ?
-
您使用的是 Oracle 还是 SQL-Server?您是否打算将 sql 表示为 sql-server?
-
OP 正在使用 HSQLDB,它是一个 RDBMS