我有兩個表,其中第一非常大(> 50M行):如何在合併時避免hsqldb中的OOM?
CREATE CACHED TABLE Alldistances (
word1 VARCHAR(70),
word2 VARCHAR(70),
distance INTEGER,
distcount INTEGER
);
和第二,可以是也相當大(> 500萬行):
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表preorganize數據,然後我合併表進行alldistances:
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)? – 2013-03-10 20:43:06
您使用的是Oracle還是SQL-Server?你打算sql來表示sql-server嗎? – 2013-03-10 20:50:21
OP正在使用HSQLDB,這是一個RDBMS – fredt 2013-03-10 20:51:54