插入空表比插入填充表快得多,为什么?

时间:2015-04-17 11:47:20

标签: sql sql-server-2014

我正在将一些数据从table2加载到SQL Server 2014上的table1中。这些表具有相同的字段,但它们的顺序不同。我正在选择每个字段并将它们插入目的地。

INSERT INTO table1(column1, column2, etc) SELECT(column1, column2, etc) FROM table2;

如果我在与table2相同的空表上运行此insert命令,它会在一分半钟内移动320万行。当我在table1上运行它(带有现有数据的14万行)时,插入相同的320万行需要将近3个小时。所以table1应该在插入后最终为1730万行。订单无关紧要。

为什么?

是因为字段的顺序不同吗?我从table1中删除了索引,所以不是这样。没有定义键或触发器。

以下是估算计划: http://i.stack.imgur.com/IuCOv.png

2 个答案:

答案 0 :(得分:1)

我发现此笔记并不真正适用于SQL Server 2014,但我想我会尝试一下。

https://support.microsoft.com/en-us/kb/297861

我在table1上创建了一个聚集索引,尝试了我的插入,并在4分钟内完成。我也用非聚集索引尝试了它但是我在30分钟后杀了它。

我不是很精通为什么这样做,但确实如此。我很高兴在更可接受的时间内插入记录。感谢大家的指点。

答案 1 :(得分:0)

当你有一张空桌

索引的B-Tree也是空的。因此,SQL Server不必对树进行排序。

当你有一张包含320万条记录的表时

索引的B-Tree不为空,因此SQL Server必须为我们插入的每条记录对树进行排序。所以需要时间。