1

Play Framework 1.2.5 で書かれたアプリケーションがあり、H2 ファイルをデータベースとして使用しています。

アプリケーションには、1 日あたり約 1000 行を取得する「Sales」テーブルがあります。そこには約 5 年間のデータがあります (通常は 2 ~ 3 年間のデータが利用可能です) ので、基本的に、テスト マシンには 150 万以上のデータを含むテーブルがあります。

私の問題は、クライアントが「日付とグループ 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

正しいインデックスを作成して最適化を行う必要があります。

たとえば、これについて

クライアントは、「日付とグループ 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

2 番目の例では、Java コードでマウントを合計する必要があります。

于 2012-11-23T10:00:44.707 に答える