如何增加H2选择查询性能?

时间:2012-11-23 08:58:21

标签: hibernate playframework h2

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

该应用程序有一个“Sales”表,每天大约有1000行。我有大约5年的数据(通常2​​ - 3年的数据将可用)所以我的测试机器基本上有一个1.5Mil +数据表。

我的问题是,客户要求提供数据,例如“给我一个日期和组合产品类型和销售类型之间的销售总额”。所以我必须像2个组和日期范围的选择查询一样。

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

我创建了另一个表格,其中包含每小时,每日和每月的总结销售额,但我可以从销售表中搜索功能。

第一个应用程序是用c#(asp.net webservice)和ms-sql server编写的,存储过程是数据库,这些操作很快就像几秒钟一样。我有相同的数据,即使我没有使用任何汇总表,使查询更快。

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

我是否可以对H2引擎进行任何优化。

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

感谢reaindg并花时间。

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

我刚刚在每个要添加到索引的列上添加了@Index(name =“sales_columnname_index”)注释,现在H2引擎的运行速度比我的旧mssql + asp.net应用程序更快。

1 个答案:

答案 0 :(得分:3)

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

例如对于此

  

客户要求提供数据,例如“给我一个日期和组合产品类型和销售类型之间的总和销售额”。所以我必须像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代码中的安装。