2013-11-20 24 views
2

我正在使用SSIS更新表中的13000行,使用SQL Server 2008 R2,表上有一个更新触发器,没有触发器更新需要< 5分钟,触发器需要> 1小时。可怜的SQL Server更新触发器性能

我本来预计它会花费两倍的时间(< 10分钟),但是它会延长。任何人都可以给我任何可能导致此问题的指针或解决问题的方法吗?

表:

CREATE TABLE [Dim].[Company] 
(
[CompanyKey] INT NOT NULL IDENTITY , 
[Name] nCHAR(255) NOT NULL, 
[City] nCHAR(100) NOT NULL, 
[Country] nCHAR(100) NOT NULL, 
[PostCode] nCHAR(20) NOT NULL, 
[Continent] nCHAR(100) NOT NULL, 
[EcconomicRegion] nCHAR(50) NOT NULL, 
[ErdfAreaType] nCHAR(10) NOT NULL, 
[PostCodeLong] nCHAR(10) NOT NULL, 
[PostCodeLat] nCHAR(10) NOT NULL, 
[Type] nCHAR(50) NOT NULL, 
[NumEmployees] int NOT NULL, 
[AnnualRevenue] MONEY NOT NULL, 
[BalanceSheetTotal] MONEY NOT NULL, 
[OwnershipType] nCHAR(50) NOT NULL, 
[MembershipType] nCHAR(50) NOT NULL, 
[AccountManagerKey] INT NOT NULL 

CONSTRAINT [PK_Company] PRIMARY KEY CLUSTERED ([CompanyKey] asc) 
) 
GO 
CREATE INDEX [IX_Company_NameCityPostcode] ON [Dim].[Company] ([Name], [City], [PostCode]) 
GO 
CREATE INDEX [IX_Company_Name] ON [Dim].[Company] ([Name]) 
GO 
CREATE INDEX [IX_Company_City] ON [Dim].[Company] ([City]) 
GO 
CREATE INDEX [IX_Company_Postcode] ON [Dim].[Company] ([PostCode]) 

触发:

CREATE TRIGGER [Dim].[Company_Update] ON [Dim].[Company] FOR UPDATE 
AS BEGIN SET NOCOUNT ON update [dim].[company] set ModifiedOn = GETDATE() END 

更新执行计划:不知道它的可见的,但它说,处决1,运营成本0.040004(92%) enter image description here

触发更新执行计划:不确定其可见,但它说执行1,运营商成本22.300197(97%) enter image description here

答: 基于Emmad贾巴尔的答案,这太问题 - trigger updates entire table even on single-row update

我改变了触发到:

CREATE TRIGGER [Dim].[Company_Update] ON [Dim].[Company] FOR UPDATE AS BEGIN 
SET NOCOUNT ON 
update [dim].[company] set ModifiedOn = GETDATE() 
from [Dim].[Company] bf 
inner join inserted i on i.CompanyKey = bf.CompanyKey 
END 
GO 

现在更新性能达到

回答

0

更新触发SQL做没有WHERE子句来指定要更新的特定行。

+0

我该怎么做?我认为触发器被更新的每一行调用一次,它知道哪一行是。 – Stuart

+0

@Stuart,对不起,我离开了。真高兴你做到了。只是想知道行首次插入时列的内容。我认为它将是空的。小心一点。 – NoChance

+0

它有一个默认约束= GETDATE() – Stuart

0

你错过了触发器的where子句,所以基本上它每次都更新表中的每一行。尝试这样的:

CREATE TRIGGER [Dim].[Company_Update] 
ON [Dim].[Company] FOR UPDATE 
AS 
UPDATE [dim].[company] 
    SET ModifiedOn = GETDATE() 
    WHERE CompanyKey IN (SELECT DISTINCT CompanyKey FROM Inserted)