2

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 的日志记录最少?

根据性能,使用顺序是什么?

4

1 回答 1

2

数据加载性能指南对最少记录的操作进行了很好的总结:

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

在您提供的不同类型的插入语句中,有两种可以归类为批量加载操作,如果满足其他先决条件,它们有机会被最低限度地记录:

  • INSERT ... SELECT– 从本地查询或任何 OLE DB 源使用 SQL Server 在进程中执行批量加载的方法。此方法仅在 SQL Server 2008 中作为最小记录操作可用。
  • SELECT INTO– 创建包含查询结果的新表的方法;利用批量加载优化。

但是,请注意,需要满足一些先决条件和条件才能最小化记录这些批量加载操作之一......

如果您满足这些条件,那么您可能会通过执行insert文章中所述的批量记录来获得更好的性能...

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

编辑:

一个澄清......请注意,它是相关的目标数据库的恢复模型。例如,如果您要从具有完整恢复模型的数据库中的表中插入临时表...由于临时表位于tempdb具有简单恢复模型的 中,因此插入临时表是一个很好的候选者被写成一个大容量记录的操作,以便最小化记录。

于 2013-02-04T18:15:59.313 回答