因此,我有一个简单的批量插入过程,可以从暂存表中获取数据并将其移入我们的数据集市。
该过程是一个简单的数据流任务,默认设置为“每批行数”,选项为“ tablock”和“无检查约束”。
桌子很大。587,162,986,数据大小为201GB,索引空间为49GB。该表的聚集索引为。
CREATE CLUSTERED INDEX ImageData ON dbo.ImageData
(
DOC_ID ASC,
ACCT_NUM ASC,
MasterID ASC
)
主键是:
ALTER TABLE dbo.ImageData
ADD CONSTRAINT ImageData
PRIMARY KEY NONCLUSTERED
(
ImageID ASC,
DT_CRTE_DOC ASC
)
现在我们遇到了一个问题,即BULK INSERT
通过SSIS的运行速度非常慢。1小时插入一百万行。填充表的查询已经排序,并且要填充的查询需要不到一分钟的时间才能运行。
当进程运行时,我可以看到查询正在等待BULK插入,这需要5到20秒的时间,并且显示的等待类型为PAGEIOLATCH_EX
。该过程一次只能执行INSERT
大约一千行。
昨天,在针对我的UAT环境测试此过程时,我遇到了同样的问题。我运行了几次该过程,试图确定此缓慢插入的根本原因是什么。然后突然之间不到5分钟就开始运行了。所以我又运行了几次,结果都一样。等待5秒或更长时间的散装插入物数量也从数百下降到大约4。
现在,这令人困惑,因为这并不像我们的活动有所减少。
CPU持续时间很短。
速度较慢的时间似乎较少等待磁盘。
实际上,磁盘延迟会在5分钟以内运行该进程的时间内增加。
在此过程运行不佳的时期,IO更低。
我已经检查过了,并且文件没有增长,因为文件仅占70%。日志文件仍有50%可用。数据库处于简单恢复模式。DB仅具有一个文件组,但分布在4个文件中。
所以我想知道的是:为什么我看到那些大批量插入的等待时间如此之长。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'
);
这基本上将所有数据保留在第4个分区中。但是,由于所有这些都将移至同一文件组。当前,数据在这些文件之间平均分配。
更新2 这些是流程运行不佳时的总体等待时间。
这是我能够运行的期间等待的过程,运行良好。
存储子系统是本地连接的RAID,不涉及SAN。日志位于其他驱动器上。突袭控制器是PERC H800,具有1 GB缓存大小。(对于UAT)Prod是PERC(810)。
我们正在使用没有备份的简单恢复。它将从每晚的生产副本中恢复。
IsSorted property = TRUE
由于数据已经排序,因此我们也在SSIS中进行了设置。
PAGEIOLATCH_EX
并ASYNC_IO_COMPLETION
指示从磁盘将数据获取到内存需要一段时间。这可能表明磁盘子系统有问题,也可能是内存争用。SQL Server有多少可用内存?
ASYNC_NETWORK_IO
表示SQL Server正在等待将行发送到某处的客户端。我想这显示的是SSIS消耗临时表中行的活动。