1

我有一个用 Play Framework 1.2.5 编写的应用程序,我使用 H2 文件作为数据库。

该应用程序有一个“销售”表,每天大约有 1000 行。我有大约 5 年的数据(通常会有 2-3 年的数据可用)所以基本上我的测试机中有一个包含 150 万+数据的表格。

我的问题是,客户要求提供诸如“给我日期之间的总和 os 销售额以及 group bu 产品类型和销售类型”之类的数据。所以我必须做一些类似于2组和日期范围的选择查询。

随着表变大,选择查询性能急剧下降。我该怎么做才能获得更好的结果?

我创建了另一个表,其中汇总了每小时、每天和每月的销售额,但是我必须从销售额表中搜索一些功能。

第一个应用程序是用 c# (asp.net webservice) 和 ms-sql 服务器编写的,其中存储过程作为数据库,这些操作只需几秒钟。而且我有相同的数据,即使我没有使用任何汇总表来更快地进行查询。

我知道,专用服务器应用程序总是比嵌入式服务器快,但我认为必须有一种方法来提高此查询的性能。

我可以对 H2 引擎进行任何优化吗?

由于并发问题,我必须在 H2 服务器上启用“MVCC”,这可能是性能问题吗?

感谢您阅读并花费您的时间。

* *编辑对于使用 Play Framework 1.2.x 的人:

我刚刚在要添加到索引的每一列上添加了 @Index(name="sales_columnname_index") 注释,现在 H2 引擎的工作速度甚至比我的旧 mssql+asp.net 应用程序还要快。

4

1 回答 1

4

您必须通过创建正确的索引来进行优化。

例如为此

客户要求提供诸如“给我日期之间的总和 os 销售额以及 group bu 产品类型和销售类型”之类的数据。所以我必须做一些像2组和日期范围的选择查询

您需要对列产品类型、销售类型和时间的索引(不一定是唯一的),如下所示:

create index sales_table_i2 on sales_table(product_type, sales_type, sales_time);

例如,在您的 HQL 查询中,您必须以确保数据库使用该索引的方式提及索引列

select sum(amount) from SalesTable where salesTime >= :start and salesTime < :end group by productType, salesType

或者

from SalesTable where productType = :prod and salesType = :sale and salesTime >= :start and salesTime < :end

在第二个示例中,您必须总结 Java 代码中的挂载。

于 2012-11-23T10:00:44.707 回答