Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何提高交叉连接请求的内存消耗_Sql_H2 - Fatal编程技术网

Sql 如何提高交叉连接请求的内存消耗

Sql 如何提高交叉连接请求的内存消耗,sql,h2,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, EventProba

出于模拟目的,我需要在表中随机创建行。 我有一个表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
);
要创建事件,我使用交叉连接请求:

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,问题是情境表中约有72k行,事件表中约有600行,JVM内存不足。我使用内存模式来并行运行多个JVM

我认为使用交叉连接请求不是最好的解决方案。你知道如何通过避免创建不必要的记录来提高内存消耗和执行性能吗? 谢谢
Laurent

我在子查询中没有使用交叉连接请求的情况下获得了所需的结果,这是主内存问题,因为此子查询的结果需要通过以下请求完全加载到内存中:

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);
在WHERE中,子句用于强制每次“计算”RAND值,否则它似乎会被缓存,或者仅使用RAND*100就足以搜索结果。对于执行性能来说,这个子查询当然不是最佳的,如果我在情境表中只有几行的话,它可能不再工作,但它是目前我找到的最好的解决方案

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