批量插入时间变化很大

Zan*_*ane 14 sql-server ssis sql-server-2012

所以我有一个简单的批量插入过程来从我们的临时表中获取数据并将其移动到我们的数据集市中。

该过程是一个简单的数据流任务,默认设置为“每批行数”,选项为“tablock”和“无检查约束”。

桌子相当大。587,162,986 数据大小为 201GB,索引空间为 49GB。表的聚集索引是。

CREATE CLUSTERED INDEX ImageData ON dbo.ImageData
(
    DOC_ID ASC,
    ACCT_NUM ASC,
    MasterID ASC
)
Run Code Online (Sandbox Code Playgroud)

主键是:

ALTER TABLE dbo.ImageData 
ADD CONSTRAINT ImageData 
PRIMARY KEY NONCLUSTERED 
(
    ImageID ASC,
    DT_CRTE_DOC ASC
)
Run Code Online (Sandbox Code Playgroud)

现在我们遇到了一个问题,BULK INSERT通过 SSIS 运行速度非常慢。1 小时插入一百万行。填充表的查询已经排序,并且要填充的查询运行时间不到一分钟。

当进程运行时,我可以看到等待 BULK insert 的查询需要 5 到 20 秒,并显示等待类型为PAGEIOLATCH_EX. 该过程一次只能处理INSERT大约一千行。

昨天在我的 UAT 环境中测试这个过程时,我遇到了同样的问题。我运行了几次这个过程并试图确定这个缓慢插入的根本原因是什么。然后突然间它在不到 5 分钟的时间内开始运行。所以我又跑了几次,结果都是一样的。此外,等待 5 秒或更长时间的批量插入的数量从数百个下降到大约 4 个。

现在这令人困惑,因为我们的活动并没有大幅下降。

持续时间内的 CPU 低。

中央处理器

当它变慢时,磁盘上的等待似乎更少。

等待

在进程运行不到 5 分钟的时间范围内,磁盘延迟实际上会增加。

潜伏

在此过程运行不佳期间,IO 低得多。

输入输出

我已经检查过并且没有文件增长,因为文件只有 70% 已满。日志文件还有 50% 的时间要处理。数据库处于简单恢复模式。DB 只有一个文件组,但分布在 4 个文件中。

所以我想知道A:为什么我看到这些批量插入的等待时间如此之长。B:发生了什么魔法让它跑得更快?

边注。它今天又像废话一样运行了。

UPDATE它当前已分区。然而,它是以一种充其量是愚蠢的方法完成的。

CREATE PARTITION SCHEME [ps_Image] AS PARTITION [pf_Image] 
TO ([FG_Image], [FG_Image], [FG_Image], [FG_Image])

CREATE PARTITION FUNCTION [pf_Image](datetime) AS 
RANGE RIGHT FOR VALUES (
      N'2011-12-01T00:00:00.000'
    , N'2013-04-01T00:00:00.000'
    , N'2013-07-01T00:00:00.000'
);
Run Code Online (Sandbox Code Playgroud)

这基本上将所有数据保留在第 4 个分区中。但是,因为它都将转到同一个文件组。数据目前在这些文件中分布相当均匀。

更新 2 这些是进程运行不佳时的总体等待时间。

等待 1

这是我能够运行该进程运行良好期间的等待。

等待2

存储子系统是本地连接的 RAID,不涉及 SAN。日志位于不同的驱动器上。Raid 控制器是具有 1 GB 缓存大小的 PERC H800。(对于 UAT)Prod 是 PERC(810) 。

我们使用没有备份的简单恢复。它每晚从生产副本中恢复。

IsSorted property = TRUE由于数据已经排序,我们也在SSIS 中进行了设置。

小智 0

我自己有时也看到在插入大型分区表时出现同样的偶发性极其缓慢的情况。您是否尝试过更新目标表统计信息然后再次运行?极端的等待时间可能是由于统计数据不佳造成的,如果在测试期间的某个时刻触发了统计更新,那么这将解释速度的提高。只是一个想法和一个简单的测试来验证。