以 AdventureWorks2019 Purchasing.PurchaseOrderDetail 為筆記目標 Table 並停用該 Table Trigger,方便觀察執行計畫 ,測試目的為用相同資料更新該筆資料,藉此觀察執行計畫
更新 PurchaseOrderID = 1 的 DueDate 欄位,2011-04-30 為原本資料
UPDATE Purchasing.PurchaseOrderDetail
SET DueDate = '2011-04-30'
WHERE PurchaseOrderID = 1
從執行計畫中可以看出,雖然資料本身沒有變化,但內部是有進行更新動作,不會因為資料沒有變化就沒有作動更新 ProductID 欄位,該欄位有 Foreign Key 關聯
UPDATE Purchasing.[PurchaseOrderDetail
SET ProductID = 1
WHERE PurchaseOrderID = 1
從執行計畫可以發現先透過 Clustered Index Seek 找到 ProductID = 1 資料後進行更新,更新後還有進 Production.Product Table 內檢查 ProductID = 1 資料是否存在上圖執行計畫 operator Clustered Index Seek 和 Clustered Index Update 之間有四個 Compute Scalar,為了版面就截切掉,方便閱讀執行計畫
結論是資料進行更新時,該欄位資料若是沒有異動,就不要出現在更新欄位內,若更新欄位存在又有 Foreign Key 相依,會去檢查資料是否存在,資料沒有變化卻又再次進行檢查
沒有留言:
張貼留言