如何对 hsqldb 中的大表执行高效的 group by / sum 聚合?
How to perform efficient group by / sum aggregation on large tables in hsqldb?
在我的 HSQL 数据库中,我有一个大的(>1000 万行)缓存 table 'Products',其中每个 Product 都有一个 'groupId' 和 'value' 列。 groupId 列上还有一个索引。在另一个缓存的 table 'Groups' (也很大,>1M 行)中,我需要存储属于该组的所有产品的所有聚合值。所以基本上我的查询看起来像这样:
MERGE INTO Groups AS g USING (
SELECT groupId, SUM(value) AS aggrValue
FROM Products GROUP BY groupId
) AS sub
ON g.groupId = sub.groupId
WHEN MATCHED THEN UPDATE SET g.value = sub.aggrValue
但是,这不适用于较大的 tables,因为如 'Temporary Memory Use During Operations' 下的 documentation 所述,所有受更新影响的行都将在更新期间保留在内存中手术。我还尝试首先使用此查询将聚合值写入助手 table:
INSERT INTO HelperTable (groupId, value)
SELECT groupId, SUM(value)
FROM Products
GROUP BY groupId
但这也超出了可用内存。我已经尝试过限制
hsqldb.result_max_memory_rows
设置为 100_000。聚合值并将它们写入组 table 的首选解决方案是什么?我的主要要求是无论产品和组的数量如何,该操作都以恒定内存运行。
按照设计,HSQLDB 完全在内存中执行一些操作,例如 GROUP BY。它还将事务历史记录存储在内存中,直到提交。
您可以根据 groupId
列分块执行操作。您需要在每个块之后提交。
您可以将更新开发为增量更新。添加新产品时,会将这些产品的价值总和添加到存储的总和中。或者当产品被移除时,值的总和将从存储的总和中减去。
在我的 HSQL 数据库中,我有一个大的(>1000 万行)缓存 table 'Products',其中每个 Product 都有一个 'groupId' 和 'value' 列。 groupId 列上还有一个索引。在另一个缓存的 table 'Groups' (也很大,>1M 行)中,我需要存储属于该组的所有产品的所有聚合值。所以基本上我的查询看起来像这样:
MERGE INTO Groups AS g USING (
SELECT groupId, SUM(value) AS aggrValue
FROM Products GROUP BY groupId
) AS sub
ON g.groupId = sub.groupId
WHEN MATCHED THEN UPDATE SET g.value = sub.aggrValue
但是,这不适用于较大的 tables,因为如 'Temporary Memory Use During Operations' 下的 documentation 所述,所有受更新影响的行都将在更新期间保留在内存中手术。我还尝试首先使用此查询将聚合值写入助手 table:
INSERT INTO HelperTable (groupId, value)
SELECT groupId, SUM(value)
FROM Products
GROUP BY groupId
但这也超出了可用内存。我已经尝试过限制
hsqldb.result_max_memory_rows
设置为 100_000。聚合值并将它们写入组 table 的首选解决方案是什么?我的主要要求是无论产品和组的数量如何,该操作都以恒定内存运行。
按照设计,HSQLDB 完全在内存中执行一些操作,例如 GROUP BY。它还将事务历史记录存储在内存中,直到提交。
您可以根据 groupId
列分块执行操作。您需要在每个块之后提交。
您可以将更新开发为增量更新。添加新产品时,会将这些产品的价值总和添加到存储的总和中。或者当产品被移除时,值的总和将从存储的总和中减去。