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

Posted

技术标签:

【中文标题】如何提高 CROSS JOIN 请求内存消耗【英文标题】:How to improve CROSS JOIN request memory consumption 【发布时间】:2014-04-28 13:01:36 【问题描述】:

出于模拟目的,我需要在表中随机创建行。 我有一个可能情况的表 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】:

我已经设法在不使用子查询中的 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 就足以满足搜索结果。如果我在 Situations 表中只有几行,这个子查询对于执行性能当然不是最佳的,或者可能不再工作,但它是目前我找到的最佳解决方案。

【讨论】:

以上是关于如何提高 CROSS JOIN 请求内存消耗的主要内容,如果未能解决你的问题,请参考以下文章

javabean 如何清除已经填充了的属性

GraphQL 如何做一个 JOIN 请求而不是许多顺序请求?

提高运行效率

Flutter中如何取消任务

如何在 PostgreSQL 中应用 CROSS JOIN?

性能调优11:查询统计