如何提高 H2 Select 查询性能?

Posted

技术标签:

【中文标题】如何提高 H2 Select 查询性能?【英文标题】:How can i increase H2 Select Query Performance? 【发布时间】:2012-11-23 08:58:20 【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

例如这个

客户要求提供诸如“给我日期之间的总和 os 销售额以及团购产品类型和销售类型”之类的数据。所以我必须做一些类似于 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 代码中的挂载。

【讨论】:

非常感谢,我会尽快检查并告诉结果 向表中添加索引给了我难以置信的结果!感谢您的回答!

以上是关于如何提高 H2 Select 查询性能?的主要内容,如果未能解决你的问题,请参考以下文章

使用子查询时如何提高查询性能

如何提高 SQL Azure 查询性能

如何提高此视图/查询的性能?

如何简化/提高这个 MySQL 查询的性能?

提高重复主约会及其异常的 SELECT 查询性能

提高这个慢查询的性能