2014-04-28 34 views
0

爲了模擬目的,我需要在表中隨機創建行。 我有一個表A可能的情況和一個表B的可能事件與概率列。如何提高CROSS JOIN請求內存消耗

CREATE TABLE Situations (
    SituationId INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY HASH 
); 
CREATE TABLE B Events (
    EventId INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY HASH, 
    EventProbability DECIMAL(13,10) NOT NULL 
); 

要創建活動中,我使用CROSS JOIN要求:

CREATE TABLE GeneratedEvents 
AS (SELECT SituationId, EventId FROM (SELECT SituationId, EventId, RAND() * 100 AS GenerationProbability, EventProbability FROM Situations CROSS JOIN Events) WHERE GenerationProbability < EventProbability); 

我只在內存模式下使用H2數據庫(即與下面的網址爲:jdbc:H2:MEM:DB ),問題在於,在情境表中有大約72k行,在事件表中有600行,我用完了JVM的內存。我使用內存模式能夠並行運行多個JVM。

我想使用CROSS JOIN請求不是最好的解決方案。任何想法如何通過避免創建不必要的記錄來提高內存消耗和執行性能? 謝謝, 洛朗

回答

0

我已經成功地獲得所需要的結果,而無需使用CROSS JOIN子查詢請求(這是因爲這樣子查詢所需要的結果是在內存滿載主存儲器的問題)與以下請求:

CREATE TABLE GeneratedEvents 
AS (SELECT SituationId, EventId FROM Situations A CROSS JOIN Events WHERE (SELECT RAND() * 100 FROM Situations B WHERE B.SituationId = A.SituationId) < EventProbability); 

子查詢:

(SELECT RAND() * 100 FROM Situations B WHERE B.SituationId = A.SituationId) 

WHERE子句用於迫使RAND()值要「評價」每一次,否則它似乎被緩存或東西如只是使用RAND()* 100應該足夠用於搜索結果。這個子查詢對於執行性能來說肯定不是最佳的,或者如果我在情況表中只有幾行,那麼這個子查詢肯定不是最佳的,但它是目前我找到的最好的解決方案。