按顺序插入速度更快

4
我有以下查询:
 INSERT INTO table(field, field1)
 SELECT value, value1  FROM table2 e 
 ORDER BY value

这个比起另一个需要更少的时间:

 INSERT INTO table(field, field1)
 SELECT value, value1  FROM table2 e 

请问有人知道原因吗?

第二个执行计划显示 SQL 仍然执行了“order by”操作,但比我的执行效率低。


4
什么叫做更优化?“为什么现在它起作用了?”是指之前有什么东西没起作用吗? - mmmmmm
除了Mark提出的重要问题,它有多快?差异是否足够显著? - hatchet - done with SOverflow
1
@CharlesBeattie 对我来说不是,我仍然不知道“更优化”是什么意思。 - Aaron Bertrand
我不明白为什么现在它能工作? - mmmmmm
1
在SQL Server 2012中,除非表上有一个IDENTITY列或者运行的SET ROWCOUNT不为0,否则这个ORDER BY语句很可能会被忽略。 - Martin Smith
显示剩余2条评论
2个回答

2

插入性能取决于您拥有的索引数量以及这些索引所在的列。如果在 table.field 上有聚集索引,插入未排序值(不按field排序的值)将非常昂贵。


SQL Server可以将排序添加到计划“DMLRequestSort”中,以考虑这一点。 - Martin Smith
@Martin Smith:我同意,优化器很有可能会处理它。但是,我不认为这是有保证的;如果源列上没有索引,它可能会决定自己排序更加昂贵。无论如何,如果我可以用SQL表达它,我更愿意给优化器少一些工作。 - a1ex07

0

你在表table2的value列上有任何非聚集索引吗?你在表上的value子句上有聚集索引吗?我可以看到两个可能的原因。

1.某种类型的非聚集索引在列值上,使优化器选择此索引并避免排序(它也可以是覆盖索引,在这种情况下,它将非常快)。查询没有任何order by的原因是因为它是一个简单的查询,没有进行优化,它执行了聚集索引或表扫描,然后对数据进行排序,这导致性能降低,与order by相比。这是最有可能的原因。

  1. 另一个原因可能是,在插入数据时,它按照获取的数据插入数据,然后如果数据被排序并且具有相同的按顺序列的聚集索引,则不会发生页面拆分,事情就会很好。但是,如果没有排序,那么值将随机插入,并可能导致页面拆分,从而略微降低性能。但是,OP已经提到优化器在插入之前进行了排序,这意味着这种情况在这里不适用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接