【问题标题】:SQL Server - insert large number of rows?SQL Server - 插入大量行?
【发布时间】:2012-06-28 13:40:45
【问题描述】:

我在这里阅读了很多关于这个主题的答案,但每个人都建议 BCP || SqlBulkCopy 来自 .net 的类

我有一个查询插入到targetTable 的联合 5 selects 来自不同的表。

我在选择的表上有正确的索引。 targetTable 上只有 1 个聚集标识索引。然而,这需要很长时间(约 25 分钟)。我说的是 5M 行(x 20 列)。

当我查看 sp_who2 时,大部分时间是suspended...

我想使用来自 .net 的 bulk 副本,但 不是(数据库已经获取数据 - 所以我不需要转到 C#)。

问题

  • 如何在我的选择命令中使用批量插入(无 bcp)?
  • 另外,为什么它大部分时间都处于暂停状态?如何为我的查询提供更高的优先级?

谢谢。

附言由于安全限制,我无法在此处使用bcp...我无权运行它。

【问题讨论】:

  • 您是否考虑过在 SQL Server 中使用“导出数据向导”?您还可以将其保存为 SSIS 包,并在以后需要时使用。它支持为源数据指定自定义查询。
  • @thecoon 开始整个过程​​的命令来自网页上的一个按钮......它启动了开始将数据提取到目标表的 sp......所以我不认为它可以在这里实现
  • 您可以在运行 Sql Profiler 的同时尝试 coon 的建议,看看它是如何完成的。

标签: sql-server performance sql-server-2005


【解决方案1】:

您是对的:这比平时花费的时间更长。你每秒得到 3k 行。您应该很容易获得每秒 10k 或 20k 的速度。在最好的情况下,每个 CPU 内核每秒 200k

我怀疑您在整个表格中插入,而不仅仅是在最后。在这种情况下,每秒 3k 行并不罕见。

无论如何,大容量复制都帮不上忙。它的插入速度并不比仅服务器的插入语句快。

不过,您可以做的是使用多个线程进行插入。将您的行源划分为 N 个不同的范围,并从单独的连接同时插入每个范围。如果您受 CPU 限制,这将有所帮助。如果您受 IO 限制,则不会。

【讨论】:

  • 你是什么意思插入整个桌子?
  • 随机位置,而不是末尾。
  • 它是一个普通的表,id 标识为种子 1,1。怎么可能没有到最后呢?
  • 嗯,在这种情况下,我不知道为什么对你来说这么慢。您需要发布更多代码和插入语句的执行计划作为屏幕截图。也许我能发现一些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 2014-08-01
  • 2012-03-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多