问题标签 [sqlbulkcopy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
32945 浏览

.net - SqlBulkCopy 超时

我正在使用 SqlBulkCopy 从 xml 备份中恢复表。其中一个表备份大约 200MB 大并且有很多记录。

我有错误:

0 投票
2 回答
1302 浏览

c# - 将 csv 文件上传到 sql server - 身份问题

给定 CSV 文件中的列结构:

和一个结构为的 SQL Server 表

(字段 ID 是一个自增 1 的身份)

如何安排它以使 SQL Server 不会尝试将 csv 文件中的 First_Name 列插入 ID 字段?

有关信息,将 csv 加载到 DataTable 中,然后使用 SqlBulkCopy 复制到 SQL Server

我是否应该在导入添加 ID 列之前修改 csv 文件(目标表在导入之前被截断,因此无需担心重复的键值。)或者可能在数据表中添加一个 id 列?

或者 Sql Server 中是否有我可能错过的设置?

0 投票
1 回答
272 浏览

sql-server - 仅将数据从一个数据库复制到另一个

我不确定这是否是这个问题的网站[如果是这样,请发表评论或投票以移动它]

如何在 SQL Server 2005 上的同一服务器内仅将数据从一个数据库复制到另一个数据库?

这两个数据库具有相同的架构但不同的数据。我正在尝试将数据从一个数据库获取到另一个数据库。

我无法从快照中恢复 [这会破坏数据库上的安全设置]。我无法使用导入数据向导,因为它也试图复制模式数据。

0 投票
2 回答
1538 浏览

sql-server - 使用 SqlBulkCopy 获取插入的行

我正在切换我的一些 Linq to Sql 代码以使用 SqlBulkCopy,问题是我需要将数千行的两次插入到两个表中。

该服务获取您的一批 10,000 个链接(从站点地图、反向链接构建器等导入),并将它们切分成每个提要 X 的 RSS 提要以进行聚合。问题是,我已经有一个3200 万行的表。如果我正在执行 linq to sql 插入,则加载 10,000 个链接需要 5 到 10 分钟之间的任何站点流量。

结构非常基础。

提要:Id bigint (PK)、Title varchar(1000)、Description varchar(1000)、Published datetime、Aggregated datetime null、ShortCode varchar(8) [过时,不再插入,但用于遗留数据]

项目:Id bigint (PK)、FeedId bigint (FK)、Title varchar(1000)、Description varchar(1000)、Published datetime、ShortCode varchar(8) [过时,不再插入,但用于遗留数据]、ShortId bigint null [插入后更新为相等的 Id(用于分区)]

FutureItems:Id bigint (PK)、FeedId bigint (FK)、Title varchar(1000)、Description varchar(1000)、Published datetime、ShortCode varchar(8) [过时,不再插入,但用于遗留数据]、ShortId bigint null [插入后更新为相等的 Id(用于分区)]

OldItems:Id bigint (PK)、FeedId bigint (FK)、Title varchar(1000)、Description varchar(1000)、Published datetime、ShortCode varchar(8) [过时,不再插入,但用于遗留数据]、ShortId bigint null [插入后更新为相等的 Id(用于分区)]

因此,如果您的提要大小为 20,您会在 Feeds 表中插入 500 个,然后在 Items 表中插入 10000 个,然后更新运行以将 ShortId 设置为等于 Id。每晚一次,将运行一个作业,将数据分离到其他两个表中,并将未来的项目转移到 Items 表中。

我读到 SqlBulkCopy 可以在几分钟内完成 2000 万行,但我找不到任何使用 FK 约束将其放入多个表的好例子。

我们的 SQL 服务器是一个“怪物”,特别是对于这个应用程序。它是 SQL 2008 R2 Web、Windows 2008 R2 Enterprise、12GB 内存、双 4 核 Xeons @ 2.8ghz。

我们的 Web 服务器是没有数据库服务的克隆。

插入链接时 CPU 运行约 85%,数据库填满 RAM。

如果 SqlBulkCopy 不好,欢迎提出任何建议,我们有付费的客户很生气,我不是 DBA,只是一个普通的老程序员。

0 投票
1 回答
488 浏览

sql-server - 给定 mysql 查询的 SQL Server 等效查询

表名:样本

表结构:

mysql查询:

SQL Server 等效查询:

使用 bcp 将不胜感激..在此先感谢..

0 投票
6 回答
4486 浏览

sql-server-2008 - 从 .NET 代码插入 SQL Server 表的最快方法?

最快的方法是什么:

  • 一张表,没有我无法预填充的引用(即那里有一个引用键,但我已经填写了所有数据)
  • 大量数据。我们每天谈论数亿行,通过 API 动态进入
  • 请求必须/应该在近乎实时的情况下尽快处理(即每天不写入文件以上传一个)。2 秒是正常的最大延迟
  • 用于数据/应用程序和 SQL Server 的单独机器

我现在应该做什么:

  • 将最多 32*1024 行聚合到一个数组中,然后将其排队。
  • 在 2-3 个线程中读取队列。使用 SqlBulkCopy 插入数据库。

我每秒导入大约 60k-75k 行,这还不够,但非常接近。我很想达到 250.000 行。

到目前为止,还没有真正使用任何东西。我得到 20% 的时间“网络 I/O”块,有一个核心 80% 负载 CPU 端。光盘正在写入 7mb-14mb,大部分是空闲的。6 只猛禽的 RAID 10 上的平均队列长度为.... 0.25。

有人知道如何加快速度吗?更快的服务器(到目前为止它是虚拟的,8GB 内存,4 核,物理磁盘通过数据)。


添加一些说明:

  • 这是 2008 R2 服务器上的 2008 R2 Enterprise SQL Server。机器有4个核心,8GB内存。全部 64 位。80% 的平均负载来自这台机器,显示大约 20% 的 cpu 负载。
  • 该表很简单,没有主键,只有关系引用(仪器引用)上的索引和唯一的(在一组仪器中,因此不强制执行)时间戳。
  • 表中的字段是:时间戳、工具参考(无强制外键)、数据类型(字符 1,指示发布哪些数据的多个字符之一)、价格(双精度)和交易量(整数)。如您所见,这是一张非常薄的桌子。有问题的数据是金融工具的分时数据。
  • 问题还与硬件等有关-主要是因为我看不到真正的瓶颈。我正在插入多个交易,它给了我一个好处,但很小。磁盘、CPU 没有显示出显着的负载,网络 io 等待很高(300 毫秒/秒,目前为 30%),但这是在运行 JSUT 两台服务器的同一虚拟化平台上,并且有足够的内核来运行所有服务器。我几乎愿意“购买另一台服务器”,但我想首先确定瓶颈......特别是考虑到在一天结束时我没有抓住瓶颈是什么。日志记录无关紧要 - 批量插入不会作为数据进入数据日志(无聚集索引)。

垂直分区是否会有所帮助,例如通过一个字节(tinyint)将仪器世界划分为例如 16 个表,因此我可以同时进行多达 16 个插入?由于实际上数据来自不同的交易所,我可以为每个交易所创建一个分区。这将是一个自然的拆分字段(实际上是在仪器中,但我可以在此处复制此数据)。


更多说明:获得了更高的速度(90k),现在显然受到机器之间的网络 IO 的限制,这可能是 VM 切换。

我现在要做的是每 32k 行建立一个连接,建立一个临时表,使用 SqlBUlkdCopy 插入其中,然后使用一个 sql 语句复制到主表 - 最大限度地减少主表上的任何锁定时间。

大多数等待时间现在仍在网络 IO 上。似乎我遇到了 VM 明智的问题。将在接下来的几个月内转向物理硬件;)

0 投票
3 回答
8198 浏览

c# - SQL Bulkcopy YYYYMMDD 问题

我在 asp.net 3.5 和 C# 中使用 SQL Bulkcopy 有一个字符串到日期的转换问题

我读了一个大的 CSV 文件(使用CSV 阅读器)。读取的字符串之一应加载到 SQL Server 2008 日期列中。

例如,如果文本文件包含字符串“2010-12-31”,SQL Bulkcopy 会将它毫无问题地加载到日期列中。

但是,如果字符串是'20101231',我会得到一个错误:
来自数据源的字符串类型的给定值无法转换为指定目标列的日期类型

该文件包含 8000 万条记录,因此我无法创建数据表....

SqlBulkcopy Columnmappings 等都可以。更改为 DateTime 也无济于事。

我试过

但这无济于事。

任何想法如何告诉 SQL Server 接受这种格式?否则,我将在 CSV 阅读器中创建自定义修复,但我更喜欢 SQL 中的某些内容。

更新 跟进两个答案,我正在使用这样的 SQL bulkcopy(正如 Stackoverflow 在另一个问题中提出的那样):

CSV 阅读器(请参阅上面的 codeproject 链接)返回字符串值(非强类型)。CSVreader 实现了 System.Data.IDataReader 所以我可以做这样的事情:

来自 iDataReader 的所有字段都是字符串,所以我不能使用 c# 方法,除非我在 CSVreader 中进行了相当大的更改

因此,我的问题与如何在 C# 中修复它无关,我可以这样做,但我想阻止它。

这很奇怪,因为如果你在 sql 中执行类似的操作

它也有效,只是不适用于批量复制。

知道为什么吗?

感谢您的任何建议,普莱恩

0 投票
2 回答
490 浏览

.net - SqlBulkCopy - 对较小的数据集(即 1000 行)有用吗?

在我麻烦地实施 SqlBulkCopy 并对其进行性能测试之前,我想知道是否有人对何时应该使用它以及是否最好在相对较小的数据集(大约 1000 行)上使用它有任何指导。在这种情况下使用它是否有任何开销,或者我应该在插入合理数量的行时始终使用它?

0 投票
3 回答
5306 浏览

c# - C# 优化:向数据库中插入 2 亿行

我有以下(简化的)代码,我想优化它们的速度:

我已经在使用 SQLBulkCopy 试图加快速度,但似乎将值分配给 DataTable 本身证明很慢。

我不知道 DataTables 是如何工作的,所以我想知道是否通过首先创建一个可重用数组,然后将其分配给 DataRow,然后将 DataRow 添加到 DataTable 来创建不必要的开销?还是首先使用 DataTable 不是最优的?输入来自数据库。

我不太关心LOC,只关心速度。任何人都可以对此提出一些建议吗?

0 投票
2 回答
4732 浏览

.net - .net:将通用列表转换为 DataReader?

嗨,我在 winform 中有一个填充的通用列表,现在想将其数据作为批量复制发送到 SQL 服务器表中。当我阅读 SqlBulkCopy 类时,它需要一个数据阅读器作为源。

现在,如何将其转换为 DataReader?

谢谢