如何提高CROSS JOIN请求内存消耗

时间:2014-04-28 13:01:37

标签: sql h2

出于模拟目的,我需要在表中随机创建行。 我有一个可能情况的表A和一个概率列可能事件的表B.

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数据库(即使用以下URL:jdbc:h2:mem:db),问题是在Situations表中有大约72k行,在Events表中有600行,我是JVM的内存耗尽。我正在使用内存模式来并行运行多个JVM。

我认为使用CROSS JOIN请求不是最好的解决方案。有没有想过如何通过避免创建不必要的记录来提高内存消耗和执行性能? 谢谢, 劳伦

1 个答案:

答案 0 :(得分:0)

我已经设法获得了所需的结果,而没有在子查询中使用CROSS JOIN请求(这是主要内存问题,因为此子查询的结果需要在内存中完全加载),并提出以下请求:< / p>

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()值进行评估&#39;每次,否则它似乎被缓存或只是使用RAND()* 100应该足以搜索结果。如果我在Situations表中只有几行,那么这个子查询肯定不是执行性能的最佳选择,或者可能不再工作,但它是目前我发现的最佳解决方案。