记录不同种类的INSERT语句

时间:2013-02-04 14:37:46

标签: sql sql-server tsql

SQL中的表中有四种插入数据:

INSERT INTO TableName (ColumnList) VALUES (ValuesList)

INSERT INTO TableName (ColumnList) SELECT Columns FROM OtherTable

INSERT INTO TableName (ColumnList) EXEC SomeProc

SELECT Columns INTO TableName FROM OtherTable

每个INSERT语句都记录在事务日志中,我的问题是什么样的INSERT具有最少的日志记录?

根据表现,使用顺序是什么?

1 个答案:

答案 0 :(得分:2)

The Data Loading Performance Guide对最小化记录操作有一个很好的总结:

  

为了支持大容量数据加载方案,SQL Server实现了   最少记录的操作。与使用完全记录的操作不同   事务日志,以最低限度跟踪每一行的变化   记录的操作跟踪范围分配和元数据   仅改变。因为跟踪的信息少得多   事务日志,最小化记录操作通常比a快   如果日志记录是瓶颈,则完全记录操作。此外,   因为更少的写入事务日志,一个小得多的日志文件   具有更轻的I / O要求变得可行。

在您提供的不同类型的插入语句中,有两个可以归类为批量加载操作,如果满足其他先决条件,则商机最少记录:

  
      
  • INSERT ... SELECT - 使用SQL Server从本地查询或任何OLE DB源执行批量加载的方法。这个   方法仅适用于SQL Server中的最小日志记录操作   2008。
  •   
  • SELECT INTO - 创建包含查询结果的新表的方法;利用批量负载优化。
  •   

但是,请注意,为了最大限度地记录其中一个批量加载操作,需要满足先决条件和条件......

如果您符合这些条件,那么您可以通过执行批量记录insert看到更好的效果,如文章中所述......

但同样,发生这种情况的先决条件非常复杂,所以我建议在创建/更改命令之前阅读本文,期望它们将被最小化记录。

编辑:

一个澄清......请注意,目标数据库的恢复模型是相关的。例如,如果要从具有完全恢复模型的数据库中的表插入临时表...由于临时表驻留在tempdb,其具有简单的恢复模型,则插入临时表table是一个很好的候选者,可以作为批量记录操作编写,以便最小化记录。