0

20 個のフィールドを持つプロファイル フォームがある場合、ユーザーはページ上で更新できます。ユーザーが 2 つのフィールドのみを変更した場合に、すべての列を更新する update ステートメントを実行するのはもったいないようです。

最高のパフォーマンスを得るためにこれを処理する最良の方法は何だろうと思っていました。

私は20個のフィールドしか持っていないので、それは実際には問題ではありませんが、それ以上になる可能性がある将来の開発について疑問に思っています.

その行のすべての列を更新するだけですか?

4

4 に答える 4

7

平均的なネットワークパケットの長さは1500バイトです。それはおそらくあなたの20のフィールドを簡単に含むことができます。したがって、20未満のフィールドを更新することで、ネットワークの負荷を節約できます。

SQL Serverは、8000バイトのページにデータを格納します。1ビットを更新すると、SQL Serverはそれを完全に変更されたページ(8000バイトのデータ)として書き留めます。したがって、20未満のフィールドを更新することで、ディスクアクティビティを節約できません。

パフォーマンスを最適化することは、多くの場合間違いです。最近のデータベースは非常に高速です。代わりに、シンプルで明確なコード用に最適化してください。

于 2012-08-02T19:01:59.227 に答える
4

Entity Framework(または他のORMツール)のようなツールは、これを「無料」で処理します。

オブジェクトで何が変更されたかを追跡し、UPDATE実際に変更された列のみを更新するオーダーメイドのステートメントを発行します。

これらの詳細についてはもう心配する必要はありません。すべてあなたのために世話をしました。それを試してみてください!

資力:

于 2012-08-02T19:03:48.583 に答える
0

現在のdbレコードをフェッチし、フィールドごとにユーザー入力と比較してから、変更されたフィールドのみを更新することしか想像できません。

これは、単一の更新ステートメントですべてのフィールドを更新するよりもコストがかかるため、単一の更新を選択します。

于 2012-08-02T19:02:35.490 に答える
0
CREATE PROC [dbo].[UpdateMe]
(
    @pkey int,
    @Col1 int = null,
    @Col2 int = null,
    ...,
    @Col20 int = null
)
AS BEGIN

    UPDATE [Table]
           SET Col1 = ISNULL(@Col1,Col1),
           Col2 = ISNULL(@Col2,Col2),
           ...
           Col20 = ISNULL(@Col20,Col20)
    WHERE pkey = @pkey

END

クライアントで何が変更されたかを追跡し、それに応じて送信します。ネットワーク経由で送信することが心配な場合は、名前付きパラメーターを使用して、変更されたものだけを送信してください。手順にはデフォルトがあるため、費用はかかりません。SQL のシーク時間はコストがかかる場所であるため、列をそれ自体に更新するのはかなり安価です。

于 2012-08-02T19:21:19.577 に答える