Sql server 并行创建SQL Server聚集索引

Sql server 并行创建SQL Server聚集索引,sql-server,query-performance,Sql Server,Query Performance,我有两张桌子 两个都是空的。 两者都有聚集索引。 恢复模式设置为“简单”。 插入…选择。。满足最小日志记录的要求。看见 两个临时表都包含大量数据。 我需要将数据从暂存表导入到它们中 如果我单独执行以下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(TA

我有两张桌子

两个都是空的。 两者都有聚集索引。 恢复模式设置为“简单”。 插入…选择。。满足最小日志记录的要求。看见 两个临时表都包含大量数据。 我需要将数据从暂存表导入到它们中

如果我单独执行以下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
为了加快速度,我在SMS中打开了两个会话,并并行执行这两个块。令我惊讶的是,每节课大约需要10到12分钟才能完成。加在一起,总时间增加了一倍多。显示的等待类型是PAGEIOLATCH,它指向磁盘I/O瓶颈。我不明白的是,即使两个会话必须互相等待I/O,也不应该等待那么久。有人能解释一下吗

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

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

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

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


是否有人经历过类似的情况,以及什么是使其更快的最佳做法?

在插入记录后创建聚集索引时,SQL必须在后台重新创建此表,以便在聚集索引已存在的情况下直接将记录插入表中会更快。 另外,在插入时禁用任何非聚集索引,并在插入后再次启用它们,在已填充的表上创建索引比为每次插入更新索引要快。创建索引时,请记住将Max DOP选项设置为0

批量插入也比insert into语句快得多。
我使用“SQL server导入和导出向导”来复制大量数据,而且该向导使用批量语句似乎要快得多。如有必要,您可以尝试查找此向导使用的语句并自己运行。

我没有什么可支持的,但我猜您的第一个测试用例具有I/O顺序的优势。。。这意味着磁盘上的磁头不必到处跳跃。。。在所有其他测试用例中,I/O都是随机的,这意味着磁头为一个表写入一个数据块,然后跳到磁盘上的另一个位置为另一个表写入另一个数据块,然后像这样来回。。。这就是为什么并行执行比顺序执行花费的时间更长。删除WITHTABLOCK提示是否会提高并行插入速度?SRC_A和SRC_B中的数据是否可能到达聚集索引的不同或相同区域?感谢您的回复。删除WITHTABLOCK不会有帮助,因为这将使插入完全记录。这两张桌子完全不同。他们的集群键列完全不同。我倾向于相信并行速度慢是由于磁头跳变造成的,但没想到成本如此巨大。我试着用谷歌搜索它,但没能找到类似的情况和解决方案。