2

私は次のクエリを持っています.CASE構造がどれほど悪いのか疑問に思っていました.DBエンジンは、E.EAOpIDがnullでない場合、E.EAOpIDにすでに含まれている値で上書きされます.

UPDATE E
SET E.EAOpID =  CASE
                    WHEN E.EAOpID IS NULL THEN @operationID
                    ELSE E.EAOpID
                END,
    E.AverageCapacity = E.AverageCapacity + 1,
    E.Average = E.Average - (E.Average - E.Value) / E.AverageCapacity
FROM
(
    SELECT E.EAOpID, E.AverageCapacity, E.Average, P.Value
    FROM Probes AS P
    INNER JOIN Estimates AS E ON P.EstimateID = E.ID
    WHERE P.EAOpID = @operationID
) AS E;

この更新を 2 つの更新に分割する方が安価かもしれません。

1

UPDATE E
SET E.EAOpID = @operationID
FROM
(
    SELECT E.EAOpID, E.AverageCapacity, E.Average, P.Value
    FROM Probes AS P
    INNER JOIN Estimates AS E ON P.EstimateID = E.ID
    WHERE   P.EAOpID = @operationID
        AND E.EAOpID IS NULL -- Additional statement here
) AS E;

2

UPDATE E
SET E.AverageCapacity = E.AverageCapacity + 1,
    E.Average = E.Average - (E.Average - E.Value) / E.AverageCapacity
FROM
(
    SELECT E.EAOpID, E.AverageCapacity, E.Average, P.Value
    FROM Probes AS P
    INNER JOIN Estimates AS E ON P.EstimateID = E.ID
    WHERE P.EAOpID = @operationID
) AS E;
4

3 に答える 3

1

値が変更されていない場合でも行を更新するには、リソースがほとんど必要ありません。変更を確認するだけで、より多くの負荷をかけることができます。システムが高度に洗練されていて、エッジに近づいている場合は、このような最適化を検討すると思いますが、リストの下位にあります。

于 2011-07-13T20:02:57.160 に答える
1

同じ行セットを読み取り/更新するため、2 回の更新ではほぼ 2 倍のリソースが使用されます。1 つのクエリですべてを取得することをお勧めします。case ステートメントでどれだけの追加処理が必要かを測定する方法はわかりませんが、以下がより少ないコーディング ロジックを使用して同じ量の作業を実行することはわかっています。から変更

UPDATE E
 SET E.EAOpID =  CASE
                     WHEN E.EAOpID IS NULL THEN @operationID
                     ELSE E.EAOpID
                 END, 
 (etc)

UPDATE E
 SET E.EAOpID = isnull(E.EAOpID, @operationID), 
 (etc)

(嬉しい場合はcoalesce代わりに使用できます。)isnull

于 2011-07-13T20:08:17.360 に答える
0

テーブルで使用する SQL Server の機能が多いほど、ノーオペレーションの UPDATE であってもオーバーヘッドが大きくなります。

操作と追加の読み取りは、インデックスのメンテナンスを超えて実行されます。

トリガー (トリガーが起動される)、外部キー (整合性は引き続きチェックされる)、制約 (ルールがチェックされる) など。

例として、既存の値の一部では失敗するテーブルに制約を追加しますが、「WITH NOCHECK」を使用して作成します。既存の列をそれ自体に更新します。値が変更されていなくても、制約の更新は失敗します。

于 2011-07-13T19:44:55.840 に答える