Sql-Server
計算列或觸發器
我們目前有一個 oninsert() 觸發器設置,每次將一行插入到表中時,都會觸發更新查詢以更新 3 個欄位。這些欄位是一個簡單的計算,例如
field1update = (amt/12)*14 field2update = (amt/12)*16 field3update = (amt/12)*18
觸發器就足夠了,但它有時會鎖定行,因此暫時無法立即訪問。我的問題是,如果將這些欄位轉換為(請原諒我的無知)計算列或計算列,我們會看到性能改進嗎?
通常這是一個電子表格導入,一次插入大約 20,000 - 25,000 行。
根據您提供的資訊,我做了一個非常基本的測試,我建議您在做出最終決定之前設置類似的東西。我的結果顯示計算列的性能優於觸發器,但我想強調它可能會隨著您的表結構、插入率、表中的其他活動而變化,並且您需要進行測試。
設置:
CREATE TABLE TestTrigger ( amt INT NOT NULL, field1update INT, field2update INT, field3update INT ) GO CREATE TRIGGER triTestTrigger on TestTrigger INSTEAD OF INSERT AS BEGIN INSERT INTO TestTrigger SELECT amt, (amt/12)*14, (amt/12)*16,(amt/12)*18 FROM inserted END GO CREATE TABLE TestCompCol ( amt INT NOT NULL, field1update AS (amt/12)*14, field2update AS (amt/12)*16, field3update AS (amt/12)*18 ) GO
插入兩個表。
INSERT INTO TestTrigger (amt) VALUES(1) GO INSERT INTO TestCompCol (amt) VALUES(1) GO
與第二個(計算列)插入(30%)相比,第一個(觸發)插入必須做更多的工作(70%)。如果我查看第一次插入 (.010023+.0132842)=0.0233072 和第二次插入的子樹成本是 0.0100022。
對於觸發器插入的 cpu 時間,我得到
SQL Server 執行時間:CPU 時間 = 0 毫秒,經過時間 = 90 毫秒。
對於計算列插入,我得到:
SQL Server 執行時間:CPU 時間 = 0 毫秒,經過時間 = 2 毫秒。