我正在使用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%)
触发更新执行计划:不确定其可见,但它说执行1,运营商成本22.300197(97%)
答: 基于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
现在更新性能达到
我该怎么做?我认为触发器被更新的每一行调用一次,它知道哪一行是。 – Stuart
@Stuart,对不起,我离开了。真高兴你做到了。只是想知道行首次插入时列的内容。我认为它将是空的。小心一点。 – NoChance
它有一个默认约束= GETDATE() – Stuart