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 行。
根据你提供的信息,我做了一个非常基本的测试,我建议你在做出最终决定之前设置类似的东西。我的结果显示计算列的性能优于触发器,但我想强调的是,它可能因您的表结构、插入率、表中的其他活动而异,并且您需要进行测试。
设置:
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 毫秒。
| 归档时间: |
|
| 查看次数: |
3488 次 |
| 最近记录: |