【发布时间】:2012-10-23 12:54:47
【问题描述】:
我一直在查看我的查询中的一个大 INSERT 问题:
INSERT table_name
SELECT .....;
该表没有索引,需要大约 2000 万行才能插入其中。我在我们的一台服务器上运行 SQL Server 2008 R2 中的查询。原版表演约40分钟。然后我在这里阅读帖子,告诉我将INSERT 包装在BEGIN TRANSACTION / COMMIT 中。我这样做了,花费的时间减少到 6 分钟。
但是,当我尝试在接下来的几次中运行事务包装查询时,时间又回到了 40 分钟,就像 TRANSACTION 效果消失了一样。我不知道在接下来的运行中发生了什么。任何的想法?
添加:
另一个post 说 TRANSACTION 旨在用于数据一致性而不是性能,建议每 5K 行批量插入。如何将单个 INSERT SELECT 语句拆分为批次?我很困惑。
更新:
确实,我发现性能提升不是来自 TRANSACTION,而是可能来自服务器端表缓存,因为我接下来运行了几次,性能大约是 5 分钟。
【问题讨论】:
-
单独
select需要多少时间? -
@Lostdreamer 根据 SQL Server 的执行计划估计,SELECT 仅占总数的 5%
-
您是使用任何前端编码插入数据还是只是在查询编辑器中运行 sql 查询?
-
你说你没有索引,但是你有主键吗?
-
如另一篇文章所述,事务与性能无关。您注意到的速度增加与交易无关(如果有的话)。
标签: sql sql-server