2011-09-15 6 views
1

いつもSELECT *が悪いと思っていました。使用する列だけを常に返すべきです。この理由の1つは、必要な列がすべてインデックスに含まれている場合、DBを使用して結果を返すことができることです。select * vs特定の列とローディングオブジェクトのプロパティ

私は、Productオブジェクトのプロパティをロードするファクトリクラスを持っています。 GetProductが呼び出されるたびにすべてのプロパティが読み込まれます。

SELECT *のためにデータベースから読み込まれても、多くのページがProductプロパティのすべてを使用することはありません。

これに関する設計アドバイス/ガイドラインはありますか?

+0

[tag:c#]と表示されたのはなぜですか?これは、SQL /クエリ作成の質問の多くです。 –

+0

初期化時に主キーと共通/索引フィールドを格納する場合は、「その他の」プロパティで遅延評価を実装することができます。 PKを利用できるので、インデックスシーク(良い&高速)でなければなりません。 – billinkc

答えて

0

私は間違いなくSELECT *を避けます。必要なデータを取得するだけです。私はすべての列を取得し、それをどこでも使用する1つのクエリを書くのではなく、それぞれが特定の目的のために必要な少数の列を参照する、同じテーブルに12のクエリを書きたいと考えています。

現在テーブル内のすべての列が必要であることがわかっていても、それぞれを明示的にリストします。そうすれば、将来誰かがテーブルに何十もの列を追加すると、古いクエリはすべて突然、必要以上のデータを取得することはありません。

+0

問題は、一部のページで特定のプロパティが使用されていることです。だから私は、GetProductメソッドを削除し、ページごとに特定のプロパティを取得する特定のメソッドを追加する必要がありますか? 例: GetProductForProductPageとGetProductForProductDetailsページ – firebird

+0

うまくいけば私はあなたに正しく従っています。 GetProductメソッドを保持します。プロダクトを表すユーザーに画面を表示する場合は、GetProductでプロダクトのすべてのプロパティを取得する必要があります。しかし、別の画面に現在のすべてのプロダクト(Product.ID、Product.Name、Product.Ownerなど)が表示されているグリッドがある場合、その3つのデータだけを取得する特別なクエリを作成し、 ProductListProxyのようにそれらを返します。とにかく、それは私がやることです。そうすれば、必要なデータだけを取り戻すことができます。 –

3

ここでのトレードオフは、潜在的なパフォーマンスとコード保守性のすべての最後のビットを鳴らすことです。使用しない列を戻すことでCPUサイクルが浪費されることは疑いありません。質問は次のようになります。次に、より高価なもの、無駄なCPUサイクル、またはプログラマーのコードの作成と保守の時間を考慮する必要があります。

性能要件が非常に高いシステムで作業している場合は、ORM /工場コードを最適化するために非常にお得です。一方、ビジネスアプリケーションの部門ラインを構築していて、スコアや何百ものORMクラスを持っているなら、おそらくプログラマー(そしてそれらを支払う必要がある人)にとっては単純な方が良いでしょう。数回の心配を止めてください。これは、Entity Framework(または他の多くのもの)のように、コード生成を使用してORMコードの大部分を足場にしたフレームワークを使用すると、さらに多くのケースになります...

システムを使用せずに構築する場合どのような種類のコード生成フレームワークでも、データアクセス層がベアメタルSQLにかなり近い場合は、必要なものだけを引き出すことは良いアドバイスです。数千人または何百万人もの人々が同時に使用する予定のアプリケーションを構築する場合は、まずSQLを最初から調整します。一方、ORMフレームワークとRADを使用するアジャイル・ショップで作業する場合、数十のSQLを書くことは生産性に欠けます。

関連する問題