如何提高 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 请求内存消耗的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL 如何做一个 JOIN 请求而不是许多顺序请求?