7

私のアプリケーションは Hibernate で JPA を使用しており、ログ ファイルに多数の結合を含むいくつかの興味深い SQL クエリが hibernate によって生成されることがわかります。現在、アプリケーションには多くのユーザーがいません。データベースのサイズが大きくなったときに、休止状態によって生成されたクエリの一部が問題を引き起こすのではないかと心配しています。

EXPLAIN コマンドを使用して hibernate によって生成された SQL クエリのいくつかを実行し、生成されたクエリ プランを確認しました。

  1. EXPLAIN の出力はデータベースのサイズに依存しますか? データベースのサイズが大きくなると、クエリ プランナーは同じ SQL クエリに対して異なるプランを生成しますか?

  2. 開発/展開サイクルのどの時点で、休止状態によって生成された SQL クエリの SQL クエリ プランを確認する必要がありますか? EXPLAIN を使用する適切な時期はいつですか。

  3. データベースが非常に小さいため、どんなに複雑に見えてもすべてのクエリが 0.5 秒未満で実行される場合、explain の出力を使用して、クエリが問題になるかどうかを判断するにはどうすればよいでしょうか?

アプリケーションのデータベースとして Postgres 9.1 を使用していますが、上記の質問に対する一般的な回答に興味があります。

4

2 に答える 2

5

実際、@amsはあなたのコメントに正解です-少量のデータでexplainを使用することは一般的に無意味です。

テーブルに10行しかない場合、すべてが1ページに含まれる可能性が高く、1行をすべての10と読み取るのに(ほぼ)同じコストがかかります。最初にインデックスに移動してからページをフェッチする方が、単にロットを読み取るよりもコストがかかります。そして、あなたが望まないものを無視します。PostgreSQLのプランナーは、インデックス読み取り、テーブル読み取り、ディスクアクセスとキャッシュアクセス、並べ替えなどのコストを構成しました。テーブルの(おおよその)サイズとテーブル内の値の分布に従ってこれらのサイズを設定します。(保留中の9.2リリースの時点で)それが行わないのは、列間または表間の相関関係を説明することです。また、プランナーの選択をオーバーライドできる手動のヒントも提供していません(MS-SQLやOracleとは異なります)。

各RDBMSのプランナーにはさまざまな長所と短所がありますが、MySQLが最も弱いと言っても過言ではありません(特に古いリリースでは)。

つまり、100人の同時ユーザーと数十億行でシステムがどのように動作するかを知りたい場合は、テストデータを生成し、そのかなりの部分をロードする必要があります。さらに悪いことに、値の分布もほぼ同じにする必要があります。ほとんどのクライアントが約10の請求書を持っているが、少数のクライアントが1000を持っている場合、それはテストデータが反映する必要があるものです。複数のRDBMS間でパフォーマンスを維持する必要がある場合は、それらすべてにわたってテストを繰り返します。

もちろん、これはシステムの全体的なパフォーマンスとは別のものであり、サーバーのサイズと機能と必要な負荷によって異なります。システムは負荷の着実な増加に対処できますが、キャッシュサイズを超えるなど、突然パフォーマンスが急激に低下します。

HTH

于 2012-09-07T08:37:57.860 に答える
4

1 EXPLAINの出力はデータベースのサイズに依存しますか?データベースのサイズが大きくなると、クエリプランナーは同じSQLクエリに対して異なるプランを生成しますか?

それはすべてあなたのデータとデータに関する統計に依存します。誰かがANALYZEを忘れたり、auto_vacuum(analyzeを含む)をオフにした場合、統計が不足しているため、多くのパフォーマンスの問題が発生します。

2開発/展開サイクルのどの時点で、Hibernateによって生成されたSQLクエリのSQLクエリプランを確認する必要がありますか?EXPLAINを使用する適切なタイミングはいつですか。

Hibernateには、単純な結合の場合でも、データベースに大量のクエリを送信する習慣があります。クエリログをオンにして、それを監視します。後で、ログからのすべてのクエリに対して自動説明を実行できます。

3データベースが非常に小さいため、どのように複雑な検索が0.5秒未満で実行されても、すべてのクエリが問題になるかどうかを判断するために、explainの出力をどのように使用できますか?

いいえ、それはすべてデータに依存するためです。ユーザーの95%が男性の場合、男性を検索するときに性別のインデックスは使用されません。あなたが女性を探しているとき、インデックスは理にかなっていて、使われるでしょう。性別=女性であるレコードの機能インデックスは、さらに優れています。インデックスの恩恵を受けることのないものにインデックスを付けることは無意味であり、インデックスははるかに小さくなります。

インデックスの使用を予測するためにできる唯一のことは、それを使ってテストするset enable_seqscan = off;ことで、いくつかのインデックスを使用できることが示されることですが、それだけです。

于 2012-09-07T09:28:17.720 に答える