【发布时间】:2017-11-14 14:40:11
【问题描述】:
在对具有相同记录数(约 5000 万)的这些表执行批量插入操作时,观察到 #temp 表与物理(实际)表之间的性能差异。
使用 (Insert into... select) 查询,临时表大约需要 3 分钟,物理表大约需要 8 分钟。
这里,物理表与临时表完全相同。(物理表没有集群和非集群索引)。
为什么临时表比物理表更高效、更好?有人对此有一些背景吗?
【问题讨论】:
-
可能临时表空间位于更高效的磁盘集上。
-
你比较过执行计划吗?您的表是否真的 100% 相同,包括确切的数据类型和长度(在 char/varchar 的情况下)?
-
检查为您的数据库设置的恢复模式。最有可能的是
full。 Tempdb 始终处于simple模式,这意味着对批量操作的记录最少。与full模式相比,这意味着事务日志的写入负载更少。 -
顺便说一句,insert into... 不会被最低限度地记录,除非 OP 指定“with (TABLOCK)”。我们还需要记住,如果为 DB 启用了 CDC,所有操作都会被完整记录,即使恢复模型很简单。
-
是的,表的所有数据类型和长度都相同。
标签: sql sql-server performance database-performance temp-tables