计算列或触发器

use*_*140 4 performance sql-server t-sql sql-server-2008-r2 performance-tuning

我们目前有一个 oninsert() 触发器设置,每次将行插入到表中时,都会触发更新查询以更新 3 个字段。这些字段是一个简单的计算,例如

field1update = (amt/12)*14
field2update = (amt/12)*16
field3update = (amt/12)*18
Run Code Online (Sandbox Code Playgroud)

触发器是足够的,但它有时会锁定该行,因此暂时无法立即访问它。我的问题是,如果将这些字段转换为(请原谅我的无知)计算列或计算列,我们会看到性能改进吗?

通常这是一个电子表格导入,一次插入大约 20,000 - 25,000 行。

Sql*_*ide 8

根据你提供的信息,我做了一个非常基本的测试,我建议你在做出最终决定之前设置类似的东西。我的结果显示计算列的性能优于触发器,但我想强调的是,它可能因您的表结构、插入率、表中的其他活动而异,并且您需要进行测试。

设置:

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
Run Code Online (Sandbox Code Playgroud)

插入两个表。

 INSERT INTO TestTrigger 
 (amt)
 VALUES(1)
 GO
 INSERT INTO TestCompCol
 (amt)
 VALUES(1)
 GO
Run Code Online (Sandbox Code Playgroud)

与第二个(计算列)插入(30%)相比,第一个(触发)插入必须做更多的工作(70%)。如果我查看第一次插入的子树成本 (.010023+.0132842)=0.0233072,第二次插入的子树成本是 .0100022。

在此处输入图片说明

对于触发器插入的 CPU 时间,我得到

SQL Server 执行时间:CPU 时间 = 0 毫秒,已用时间 = 90 毫秒。

对于计算列插入,我得到:

SQL Server 执行时间:CPU 时间 = 0 毫秒,已用时间 = 2 毫秒。