2013-10-08 79 views
2

我有两个表T_AT_B并行SQL Server聚簇索引创建

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

如果我单独执行以下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分钟才能完成。

从我的测试结果中,我最好的选择是回到原来的一个方法:依次在表上使用聚簇索引执行两个事务。

有没有人遇到类似的情况,以及使其更快的最佳做法是什么?

+0

我没有什么可以支持的,但我的猜测是你的第一个测试用例有I/O顺序的优点...这意味着磁盘上的磁头不必跳过所有的地方......在所有其他测试案例中,I/O都是随机的,这意味着磁头为您的一个表格写入一个块,然后跳转到磁盘上的另一个位置为另一个表写入不同的块,并且像这样来回......这就是为什么并行执行比顺序执行需要更长的时间。 –

+0

删除WITH(TABLOCK)提示是否可以提高平行插入速度? SRC_A和SRC_B中的数据可能碰到聚集索引的不同区域还是相同区域? –

+0

感谢您的回复。删除WITH(TABLOCK)将无济于事,因为这将使插入变为完全记录。而这两张表格完全不同。他们的集群键列完全不同。 – Shawn

回答

0

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

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

相关问题