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具有最少的日志记录?
根据表现,使用顺序是什么?
答案 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是一个很好的候选者,可以作为批量记录操作编写,以便最小化记录。