我不确定我发现的是否是一个错误,但它确实看起来像。我找不到太多关于它的信息,所以我决定把它放在这里。
因此,简而言之,在分区表上定义的触发器中访问内部表(inserted
和)时,我面临着糟糕的性能。deleted
为了测试这个问题,我创建了一些简单的表,完全相同,但一个是分区的,另一个不是:
create table [dbo].[Test1](
[part_id] [int] not null,
[id] [int] not null,
[cost] [float] null,
constraint [pk__Test1] primary key clustered ([part_id] asc, [id] asc) on ps_part(part_id)
);
create table [dbo].[Test2](
[part_id] [int] not null,
[id] [int] not null,
[cost] [float] null,
constraint [pk__Test1] primary key clustered ([part_id] asc, [id] asc)
);
然后我用一些数据填充了表格。我现在没有数据生成脚本,我只是使用了一些本地数据,但是这些表中有大约 473 个不同的分区和大约 383M 行。
然后我刚刚测试了这些表的更新速度有多快,使用非常简单的查询,例如
update dbo.Test1 set cost = cost + 0.1 where part_id = ??;
update dbo.Test1 set cost = cost - 0.1 where part_id = ??;
update dbo.Test2 set cost = cost + 0.1 where part_id = ??;
update dbo.Test2 set cost = cost - 0.1 where part_id = ??;
结果是分区表的逻辑平均更新时间约为2 秒,非分区表的平均更新时间约为4 秒。
然后我在两个表上创建了简单的触发器
alter trigger [dbo].[Test1__changed] on [dbo].[Test1]
after insert,update,delete
as
begin
set nocount on;
select a.part_id
into #temp11111111
from (
select r.part_id from inserted as r
union
select r.part_id from deleted as r
) as a;
end
之后我尝试了相同的测试查询,结果非常奇怪 - 在分区表上,查询平均需要3 分钟才能完成,而在非分区表上,时间与没有触发器的情况相似 -大约4 秒。
你知道为什么会发生这种情况吗?有什么办法可以解决这个问题?