小编Rom*_*kar的帖子

以不妨碍并行的方式模拟用户定义的标量函数

我想看看是否有办法欺骗 SQL Server 为查询使用某个计划。

1. 环境

想象一下,您有一些在不同进程之间共享的数据。因此,假设我们有一些占用大量空间的实验结果。然后,对于每个过程,我们知道我们想要使用哪一年/哪月的实验结果。

if object_id('dbo.SharedData') is not null
    drop table SharedData

create table dbo.SharedData (
    experiment_year int,
    experiment_month int,
    rn int,
    calculated_number int,
    primary key (experiment_year, experiment_month, rn)
)
go
Run Code Online (Sandbox Code Playgroud)

现在,对于每个过程,我们都将参数保存在表中

if object_id('dbo.Params') is not null
    drop table dbo.Params

create table dbo.Params (
    session_id int,
    experiment_year int,
    experiment_month int,
    primary key (session_id)
)
go
Run Code Online (Sandbox Code Playgroud)

2. 测试数据

让我们添加一些测试数据:

insert into dbo.Params (session_id, experiment_year, experiment_month)
select 1, 2014, 3 union all
select 2, 2014, 4 
go

insert into …
Run Code Online (Sandbox Code Playgroud)

performance sql-server functions sql-server-2016 query-performance

12
推荐指数
2
解决办法
1003
查看次数

分区表和性能上的触发器

我不确定我发现的是否是一个错误,但它看起来确实是这样。我找不到太多有关它的信息,所以我决定把它放在这里。

因此,简而言之,在访问内部表(inserteddeleted分区表上定义的触发器中的

为了测试这个问题,我创建了一些简单的表,它们完全相同,但一个是分区的,另一个不是:

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

然后我用一些数据填充了表格。我现在没有数据生成脚本,我只是使用了一些本地数据,但是这些表中有大约 473 个不同的分区和大约 383M 行。

然后我刚刚测试了这些表的更新速度,使用非常简单的查询,例如

update dbo.Test1 set cost = cost + 0.1 where part_id = ??;
update dbo.Test1 set cost = …
Run Code Online (Sandbox Code Playgroud)

trigger performance sql-server partitioning sql-server-2016

7
推荐指数
2
解决办法
1052
查看次数