最初のテーブルが非常に大きい(> 50M行)2つのテーブルがあります。
CREATE CACHED TABLE Alldistances (
word1 VARCHAR(70),
word2 VARCHAR(70),
distance INTEGER,
distcount INTEGER
);
また、非常に大きくなる可能性のある1秒(> 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を回避するスマートな方法はありますか?