16

通常、サーバー側のコードでは、パフォーマンスを向上させるために「select * from table」を使用するのではなく、必要に応じて必要な列をクエリする必要があります (名前を選択し、従業員から追加します)。

今、休止状態に疑問があります。主キーに基づいてレコードを取得するには、休止状態で session.load(id) を使用する方が良いと読みました。これにより、指定された 'id' (テーブルのレコード) のエンティティに関連付けられたすべての列が取得されます。

これは、一般的なデータベース パフォーマンスのガイドラインに反するものではありません。hibernate ネイティブ SQL クエリと hibernate クエリ言語のどちらでパフォーマンスが向上しますか?

パフォーマンスを向上させるためにコードを調整しようとしているので、貴重な情報をお知らせください。

4

2 に答える 2

43

あなたはいくつかの部分を台無しにしています。HQLでも特定の列のみを選択できます。たとえば、select column from tableHQLで使用できます。

ネイティブ SQL は必ずしも HQL よりも高速ではありません。HQL も最終的に SQL に変換されます (show_sqlプロパティを true に設定してアプリケーションを実行すると、生成されたステートメントを確認できます)。場合によっては、Hibernate が最も効率的なステートメントを生成しないため、ネイティブ SQL の方が高速になることがありますが、ネイティブ SQL を使用すると、アプリケーションはあるデータベースから別のデータベースへの移植性を失うため、通常は休止状態のマッピングと HQL を調整することをお勧めします。ステートメントを使用して、より効率的な SQL ステートメントを生成します。一方、ネイティブ SQL では、Hibernate キャッシュが不足しています。その結果、場合によっては、ネイティブ SQL が HQL よりも遅くなる可能性があります。

を使用するsession.load(class, id)と、行がまだキャッシュにない場合でも、ロードによって が生成されるselect * from classTableため、速度は HQL と同じfromです。(ただし、オブジェクトが既にキャッシュにある場合は、おそらくloadより高速です。)

あなたのパフォーマンス ガイドラインには同意しません。ほとんどの場合、すべての列をロードするか、必要な列のみをロードするかは、パフォーマンスには関係ありません。データベース アクセスでは、データをアプリケーションに転送するときではなく、行を検索するときに時間が失われます。必要な列のみを読み取る場合、次の欠点があります。

  • まだロードしていない列が必要な場合、アプリケーションを変更するのがより困難になります (または、行を再度ロードする必要があり、パフォーマンスが低下します)。
  • アプリケーションに悪い設計を与えます (Hibernate は 1 つのテーブルと 1 つのクラスを優先します)
  • Hibernate キャッシュではうまく機能しません。

(アプリケーションでまったく必要のない列がある場合、またはアプリケーションの終了後に追加される列がある場合は、それらをクラスとマッピングに配置しないだけで、ロードされることはありません。アプリケーションの設計はまだ適切です.Hibernate はselect * from tableステートメントを生成しません.常に生成しselect col1, col2, ... from tableます.)

例外が 1 つあります。膨大な量のデータ (数千行) をロードする場合、必要な列のみをロードすると、大幅に高速になります。

于 2012-08-30T09:11:18.853 に答える