我有一个用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应用程序更快。
答案 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代码中的安装。