为什么“从源表中将*选择到目标表中”比“从源表中将*选择到目标表中”要快


9

这个标题就是问题。我很好奇知道答案。有人告诉

选择进入是最少登录到简单恢复模型数据库中的。。。我根本没有进入。

微软摘录:

SELECT ... INTO的日志记录数量取决于对数据库有效的恢复模型。在简单恢复模型或批量记录的恢复模型下,批量操作的记录最少。使用最少的日志记录,使用SELECT…INTO语句比创建表然后用INSERT语句填充表更有效。

寻求帮助

谢谢


您正在使用什么数据库?这些表是什么结构?您如何衡量一个比另一个更快?

如果编写良好的DBMS有任何差异,我会感到惊讶。

数据库:SQL SERVER 20005 ...,我听到这个..即使我不是100%肯定...我在寻找什么其他人民说..正如我前面提到,有人告诉我,这...

找到一个链接,该链接确认不使用完全恢复时SELECT INTO可以最少地记录该链接。
Damien_The_Unbeliever

Answers:


10

几个想法/理论:

SELECT INTO ...使RDBMS根据原始表的顺序确定排序顺序。如果您插入到现有表中,则可能需要某种排序来匹配聚集索引或非聚集索引。

无索引 -当您SELECT INTO...RDBMS肯定知道没有要更新的索引时。

无争用 -由于要插入的表不存在,因此SQL Server无需担心行级锁定或争用处理。没有其他可以引用您创建的表,因为它不存在。

综上所述,还有其他方法可以非常快速地插入表中。

  • 确保您的聚集索引键尽可能匹配。这意味着没有即时排序

  • 禁用所有非聚集索引。不言自明。

  • 将恢复模式设置为简单,并将跟踪标志610设置为ON。使用TABLOCK目标表上的提示和NOLOCK源表上的提示。

例如,假设表a和表b具有相同的聚集索引:

INSERT INTO TableB WITH (TABLOCK)
SELECT <Columns>
FROM TableA WITH (NOLOCK)

以我的经验,这比使用SELECT INTO...然后再创建聚簇索引要快。请注意,这也可以在已经有数据的表上使用,这是一个非常有用的方案。

编辑:

这是MS提供的有关Sql Server 2008中数据加载性能的极为详尽的白皮书。


3
很彻底的回答JNK。同样,如果正确实现并且恢复模型不完整,那么简单的SSIS数据流任务可能比这两个任务都要快。为什么?以上两种都将发出排他锁(读是多线程,写是单线程)。只要表锁与目标适配器一起使用,SSIS就会使用批量更新锁(读和写都是多线程的)。
brian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.