2

マージステートメントで「新しい値」が変更されない列を更新しないようにする方法はありますか?
出力句で挿入されたテーブルからフィールドを取得する必要があるため、更新を行う必要があります。

もちろん、目標はIO書き込みを回避することです

WHEN MATCHED THEN
    UPDATE
    SET 
        productName = Src.productName -- Only if Src.productName <> productName
        , productNameModel = Src.productNameModel -- Only if Src.productNameModel <> productNameModel
        , brandID = Src.brandID -- Only if Src.brandID <> brandID
        , ean = Src.ean -- Only if Src.ean <> ean
        , categoryID = Src.categoryID -- Only if Src.categoryID <> categoryID
        , resellerPrijsEx = Src.resellerPrijsEx -- Only if Src.resellerPrijsEx <> resellerPrijsEx
        , inStock = Src.inStock -- Only if Src.inStock <> inStock
        , warrantyID = Src.warrantyID -- Only if Src.warrantyID <> warrantyID
        , productNamePn = Src.productNamePn -- Only if Src.productNamePn <> productNamePn
OUTPUT Src.ID, inserted.ID, Src.hasDescription INTO @tblID (tmpID, ID, hasDescription) -- Yet UPDATE is required since I need to retrieve inserted ID
;
4

2 に答える 2

3

いくつかのフィールドをスキップして更新しなくても、それほど重要ではないと思います。SQL Server は各フィールドを更新するために個別の I/O 操作を行わず、その I/O 操作は高度に最適化されているため、いくつかのフィールドをスキップしても違いはありません (少なくとも 1 つのレコードが 1 ページに収まる場合)。

SQL Server がどのようにページをディスクに書き込むかについて、もう少し確認してください。実際には、フィールドをスキップしてもパフォーマンスに違いはありませんが、コードが複雑になることがわかります。

于 2013-10-16T11:48:06.700 に答える