1

これは、Javaを使用したWebインターフェイスのプログラミングに適用される非常に単純な質問です。たとえば、私はORMを使用していません(使用している場合でも)。たとえば、この車(id、name、color、type、blah、blah)エンティティがアプリにあり、CARテーブルがあります。データベースでこのエンティティを表します。したがって、多数の車のフィールドのサブセットのみを更新する必要があるとすると、一般的なフローは次のようになることを理解しています。

  1. DAOクラス(CarDAO)-getCarsForUpdate()
  2. すべてのCarオブジェクトを反復処理し、色だけを更新して緑か何かを言います。
  3. updateCars(Carscars)への別のDAO呼び出し。

さて、これは単純な選択と更新のクエリであるために、茂みの周りを少し叩いているのではありませんか?上記の最初のステップでは、データベースからオブジェクトデータ全体を取得します。「 selectid 、color from CAR where。」ではなく、「select id、name、color、type、blah、blah .. where..fromCAR 」です。 .. "。では、DAO呼び出しを投稿するときに、「色」以外のものを使用しないのに、なぜこれらの余分なフィールドを取得する必要があるのでしょうか。同じことが最後のステップ3にも当てはまります。または、IDと色だけをクエリして(id、colorを選択)、IDと色だけが入力された車のオブジェクトを作成するとします。これで問題ありません。車のオブジェクトはとにかく貧血ですか?

これらすべて(オブジェクト指向性)は少し偽物のように見えませんか?

4

3 に答える 3

4

1つは、RDBMSがクエリを処理できる場合は、それを許可することです。その理由は、特にエンタープライズアプリケーションを実行しているときに、JVMにすべての作業を実行させたくないためです(同じリソースを必要とする多数の同時接続があります)。

データベース内のオブジェクトを特に更新する(たとえば、車の色を緑に設定する)場合は、次のようなSQLをお勧めします。

UPDATE CAR SET COLOR = 'GREEN';

( WHERE句を使用していないことに注意してください) 。これによりALL テーブルが更新され、すべてのオブジェクトCARをプルして呼び出し、更新する必要はありませんでした。CarsetColor("Green")

後から考えると、私が言おうとしているのは、工学の知識を応用するということです。DAOは、高速選択、更新などを実行し、すべてのSQLの「動作」をRDBMSで処理できるようにする必要があります。

于 2012-06-04T09:28:28.200 に答える
2

私の経験から言えば、結合操作を行っていない限り、つまり同じテーブルから列をクエリするだけである限り、フェッチする列の数はパフォーマンスにほとんど影響しません。パフォーマンスに実際に影響するのは、取得する行数とwhere句です。2列または20列をフェッチすると変化がほとんどないため、違いはほとんどわかりません。更新するのと同じこと

于 2012-06-04T09:30:26.017 に答える
1

特定の状況では、オブジェクトのフィールドのサブセットを要求すると便利と思います。BLOBこれは、カラムの数が多い場合、または水和した場合にパフォーマンスに影響を与える大きなカラムがいくつかある場合に、パフォーマンスを向上させる可能性があります。データベースは通常、一致する場合は常に情報の行全体を読み取りますが、BLOBIO要件が重要なさまざまな場所に、その他の大きなフィールドを格納するのが一般的です。

大きなテーブルを反復処理して、ある種の処理を実行している場合にも意味があります。単一の行では節約は重要ではないかもしれませんが、大きなテーブル全体で測定できる可能性があります。

また、インデックス内のフィールドのみを使用している場合、行自体が読み取られることはなく、インデックス自体のフィールドが使用されると思います。ただし、例でcolorはインデックスが作成されるかどうかはわかりません。

とはいえ、データベースフィールドがない、または他の大きなデータベースフィールドがない比較的単純なオブジェクトのみを永続化する場合BLOB、クエリ処理、行IO、JDBCオーバーヘッド、およびオブジェクト作成にかなりの時間がかかる可能性が高いため、これは時期尚早の最適化に変わる可能性があります行のフィールドのサブセットを水和することと比較して。データベースオブジェクトを最終的なJavaクラスに変換することは、通常、各クエリの負荷のごく一部です。

于 2012-06-05T20:49:47.053 に答える