Sql-Server

計算列或觸發器

  • April 27, 2017

我們目前有一個 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 毫秒。

引用自:https://dba.stackexchange.com/questions/172098