あなたはいくつかの部分を台無しにしています。HQLでも特定の列のみを選択できます。たとえば、select column from table
HQLで使用できます。
ネイティブ 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 つあります。膨大な量のデータ (数千行) をロードする場合、必要な列のみをロードすると、大幅に高速になります。