SQL Server聚集索引并行创建

时间:2013-10-08 00:04:06

标签: sql-server query-performance

我有两张表T_AT_B

我需要从登台表中导入数据。

如果我单独执行以下T-SQL块,则每个块需要2到3分钟才能完成。总时间约为5至6分钟。

BEGIN TRAN
  INSERT INTO T_A WITH(TABLOCK) FROM SRC_A WITH(NOLOCK);
COMMIT TRAN

BEGIN TRAN
  INSERT INTO T_B WITH(TABLOCK) FROM SRC_B WITH(NOLOCK);
COMMIT TRAN

为了加快速度,我在SMSS中打开两个会话,并行执行这两个块。令我惊讶的是,每个课程大约需要10到12分钟才能完成。总时间增加了一倍多。显示的wait_typePAGEIOLATCH_SH,指向磁盘I / O瓶颈。我不明白的是,即使两个会话必须等待I / O,它也不应该等待那么长时间。有人可以帮忙解释一下吗?

我的故事还没有结束。然后我删除了两个表上的聚簇索引,并在不同的会话中并行运行了两个块。这个时间大约需要1分钟才能完成。它们并行的总时间约为1分钟。大!但是,当我尝试创建聚簇索引时,就会出现噩梦。

如果我单独创建群集索引,则每个群集索引需要4分钟才能完成。总时间约为8分钟。这打败了我提高绩效的目的。

然后我尝试在不同的会话上并行创建两个表上的聚簇索引。这次是最糟糕的:一个需要12分钟才能完成,另一个需要25分钟才能完成。

从我的测试结果中,我的最佳选择是回到原点:使用表上的聚集索引按顺序执行两个事务。

有没有人遇到类似的情况,最好的做法是什么让它更快?

1 个答案:

答案 0 :(得分:0)

在插入记录后创建聚簇索引时,SQL必须在后台重新创建此表,因此将记录直接插入到已存在聚簇索引的表中会更快。 同时在插入时禁用任何非聚集索引并在之后再次启用它们,在填充表上创建索引比为每个插入更新它们更快。记住在创建索引时将Max DOP选项设置为0.

批量插入也比插入语句快很多。 我使用' SQL服务器导入和导出向导'用于复制大量数据,它似乎更快(向导使用批量语句)。如有必要,您可以尝试查找此向导使用的语句并自行运行。