2012-04-17 3 views
2

ここでは環境: 組み込みh2データベースに基づく顧客向けのアプリケーションをプログラミングしました。テスト。 データベースは29テーブルと26ビューで構成されています。 26のビューのうち8つだけがJavaで実際に "使用"され、ビューの休止状態がポーズにマップされます。他のビューは、いくつかの値を集約し、次にいくつかの列でグループ化するなど、他のビューのバックグラウンド計算を実行するだけです。 これらのビューでは多くの計算が行われます。私たちはあなたの計算にエラーがあるかどうかを確認するために、あなたの好きなツール(例えばh2コンソール)でデータベーステーブルを簡単にチェックできるので、javaで計算することに反対しました。その事実のため、hibernateは、その行の一つのカラムがNULLだったならば、常に全てのカラムでNULL値を持つ全行を返すので、それらのビューには多くの "CASE WHEN ... END"文があります。私たちは決してその問題について指摘することはできませんでした...それにもかかわらず、計算上の分裂もあったために、とにかく0と0.0をチェックする必要がありました。 いくつかの中間値は時々別の場所で使用されるため、ビューは「積み重ねられています」。しかし、常に6つのビューの「スタック」を使用する別のビューにも基づいている、最終ビューの「下」に7つのビューの「スタック」が常に存在します。いくつかのビューは同じではないものもあります。ビューを使用しているh2ベースのJavaアプリケーションのスケーリングに問題があります

は今、ここで問題が来る: 約1つのビューがデータを配信する「興味深い」テーブル内のデータベースにレコードのカップル(のような20)(4集計行)を挿入します。 400ms。それは私たちのために大丈夫です。 データを約500〜2000レコードにスケールアップすると、特別なビュー(約25個の集約された行を配信)がデータを配信するのに1時間以上(1時間)かかります。 マシンは、8GBのRAM(-Xmx2Gおよび-Xms1G)CPU 2,66GHz(Intel(R)Core 2 Quad CPU Q8400 @ 2.66GHz)または4GBのRAMを搭載したWindows XP(-Xmx1G -Xms512m)CPUは不明ですが、おそらくは@ 2GHzのシングル/デュアルコアです。

これまでの分析: 私はアプリケーションのメモリ使用量を追跡しましたが、これは主な問題ではありません。 長時間実行されているクエリでスタックトレースを見ると、hibernate getEntityManager()。createQuery(getCriteriaQuery())。getResultList()にスタックポイントが(時には)最大100レベル明らかな「時間消費者」は、org.h2.table.TableFilter/Table/TableView.getBestPlanItemとorg.h2.table.Plan.calculateCostとorg.h2.index.ViewIndex.getCostです。 すべてのビューのすべての結合で、欠落している索引を確認しました。見つかった索引、追加された索引、成功しませんでした。

私のテスト: 私は、同じLinuxマシン上のPostgreSQL(8.1)に、すべてのデータとスキーマを転送(バニラが微調整していない)と、そこにテストを実行し、その結果(任意のvaccuumまたはREINDEXを実行する前に!)圧倒的です:約。 6秒。 h2で約1時間かかった同じデータで同じビューを表示します。

今、私は本当に私のデータベースを切り替えるにはしたくないけど、誰もが良いアイデアを持っていない限り、それは究極の選択肢だろう...

備考:事で 私が見つけたは以下の通りです: ときh2のinformation_schemaのビューをチェックすると、彼は自分自身でビューを分析するかなりの仕事をしていることがわかります。 SQLスクリプト内のすべてのビューは、20〜120行(約)です。情報スキーマの "コンパイルされた"ビューの範囲は、2KBytesから3MBytes(つまりメガバイト)です。上記のものは、ほぼ400kです... これはまた、問題の一部です...

OK、それはすべての人々です。私はどんな助けでも優雅です。 hibernateとCriteriaQueryを全面的に使用しているので、私はデータベースを切り替えるつもりです。唯一の作業は、jdbcコネクタの切り替え、ビュー内のいくつかのコードの変更(すでに行われていますが、プロダクションの前に2回チェックする必要があります)、 PostgreSQLまたはMSDEがMSDEを壊れたままにしてしまう可能性があるその他の望ましくないエラーにつながるデスクトップPC(irk)のMSDE、または何らかの理由でデータベースが起動しない場合...

よろしくお願いします。 Holger

答えて

1

クエリ/ビューは、H2が最適化するにはあまりに複雑すぎるかもしれませんが、詳細(問題を再現するコード)を知らなくても言うことはできません。 PostgreSQLのオプティマイザはH2オプティマイザより優れています。おそらく、追加の索引を作成する必要があります。これを分析するには、performance optimizations and indexesに関するドキュメントを読むことをお勧めします。

関連する問題