我需要将数据插入名为Stagingusing 的模式中的表中SqlBulkCopy.
看来API只允许您使用DestinationTableName属性设置目标表名.
我该如何做到这一点?可能吗?
最快的方法是:
我现在应该做什么:
我每秒输入大约60k-75k行,这还不够,但非常接近.我想要达到250.000行.
到目前为止还没有真正使用过.我得到20%的时间"网络I/O"块,有一个核心80%加载CPU端.光盘写出7mb-14mb,大部分是空闲的.RAID 10上的6个raptors的平均队列长度是...... 0.25.
任何人都知道如何加快速度?更快的服务器(到目前为止它是虚拟的,8GB RAM,4个核心,物理磁盘通过数据).
添加一些说明:
垂直分区是否有助于,例如通过一个字节(tinyint)将仪器世界分开,例如16个表格,因此我最多同时进行16次插入?实际上,数据来自不同的交易所,我可以为每个交易所制作一个分区.这将是一个自然的分裂场(实际上是在乐器中,但我可以在这里复制这些数据).
更多澄清:速度更高(90k),现在明显受到机器之间的网络IO的限制,这可能是VM切换.
我现在要做的就是做每32K行的连接,搭起一个临时表,插入此与SqlBUlkdCopy,然后用一条SQL语句复制到主表 - 在主表最大限度地减少任何锁定时间.
大多数等待时间现在仍在网络IO上.似乎我遇到了VM明智的问题.将在未来几个月转移到物理硬件;)
这是我的代码,包含以下列,在DB中,这些列是nvarchars.
SqlBulkCopy bulkCopy = new SqlBulkCopy(connection,
System.Data.SqlClient.SqlBulkCopyOptions.Default, transaction);
bulkCopy.DestinationTableName = "Test";
bulkCopy.ColumnMappings.Add("Number", "Code");
bulkCopy.ColumnMappings.Add("Type", "Type");
bulkCopy.ColumnMappings.Add("Group", "Group");
bulkCopy.ColumnMappings.Add("Short Text", "ShortText");
bulkCopy.ColumnMappings.Add("Text", "Description");
bulkCopy.WriteToServer(dataTable);
Run Code Online (Sandbox Code Playgroud)
我试图在数据库中插入一个完整的数据表,使用批量复制,但我收到此错误:
数据源中String类型的给定值无法转换为指定目标列的类型nvarchar.
我熟悉C#SqlBulkCopy类,您可以在其中调用通过DataTable传递的'WriteToServer'方法.
我的问题是SQL服务器中的底层机制用于批量插入数据?
我问的原因是批量插入 MSDN T-SQL帮助文件中引用的批量插入需要导入数据文件.SqlBulkCopy是否创建数据文件?
我想了解这些东西,以确定我是否可以在SQL中使用批量插入功能.
如果我编写一个SQL语句,准备将所有行插入特定表(数千行),我可以将它们批量插入到目标表中吗?这样的事情就是我现在这样做的方式,
INSERT INTO sync_filters (table_name, device_id, road_id, contract_id)
SELECT * FROM dbo.sync_contract_filters (@device_id)
Run Code Online (Sandbox Code Playgroud)
dbo.sync_contract_filters是一个生成要插入的所有行的函数.这可以批量插入吗?
我试图将大量数据插入SQL服务器.我的目标表有一个名为"Hash"的唯一索引.
我想用SqlBulkCopy替换我的SqlDataAdapter实现.在SqlDataAapter中有一个名为"ContinueUpdateOnError"的属性,当设置为true时,adapter.Update(table)将插入所有可能的行,并使用RowError属性标记错误行.
问题是我如何使用SqlBulkCopy尽可能快地插入数据,同时跟踪哪些行被插入以及哪些行没有(由于唯一索引)?
以下是其他信息:
该过程是迭代的,通常按计划重复进行.
源表和目标表可能很大,有时可能有数百万行.
即使可以首先检查哈希值,但每行需要两个事务(首先从目标表中选择哈希,然后执行插入).我认为在adapter.update(table)的情况下,检查RowError比检查每行的哈希命中要快.
我有一个应用程序,通过c#中的批量复制类从我的数据库中复制.
发生异常时,我可以在sql server中回滚批量复制操作吗?
我试图找到使用SqlBulkCopy与SqlBulkCopyOptions.UseInternalTransaction复制选项和没有它之间的区别,但在我的测试应用程序中,我没有发现任何差异.如果BatchSize是例如0并且我添加了100条记录(在a中DataTable),其中记录号50在将其添加到数据库表时导致错误,我在表中得到0条记录.BatchSize例如,如果设置为10,则会获得40条记录(4批10条记录,第5批包含错误记录并导致批量复制中止).如果qlBulkCopyOptions.UseInternalTransaction设置了S无关紧要,我总能得到相同的结果.看起来批次总是复制在内部事务中.
如果您对我的测试应用程序感兴趣,那么它是:SqlBulkCopy-Error-and-Transaction-Test.zip
我的问题是:
SqlBulkCopyOptions.UseInternalTransaction过时因为SqlBulkCopy总是使用内部交易?希望有人能澄清一下
编辑:
根据答案和评论我认为我的问题不够明确.我知道文档.它说"默认情况下,批量复制操作是它自己的事务." 并且每个批次在传递时都使用它自己的事务UseInternalTransaction.但是,如果这意味着默认情况下,批量复制操作仅对整个批量复制使用一个事务(而不是每个批次一个),如果我将BatchSize设置为特定大小并且后面的批处理,则不会在数据库中获取记录第一个导致错误.如果仅使用一个事务,则将回滚添加到事务日志中的所有记录.但是我得到了包含错误记录的批次之前的批次记录.根据这一点,似乎默认情况下每个批次都在它自己的事务中执行.这意味着我是否通过没有任何区别UseInternalTransaction.如果我走错了路,我真的很感激,如果有人能澄清的话.
一个事实可能很重要:我使用的是SQL Server 2012.也许SQL Server 2008的行为有所不同.我会检查一下.
编辑:感谢usr的回复,我想我找到了答案:我调试了一下,发现如果没有定义UseInternalTransaction,私有字段_internalTransaction真的没有设置.然后,SqlBulkCopy不使用自己的(内部)事务.但是分析表明SqlBulkCopy使用TDS(表格数据流)来复制数据(无论BatchSize是什么).我没有找到关于TDS的更多信息,特别是对于SQL Server,但我假设SQL Server在内部事务中执行TDS批量复制操作.因此,对于SQL Server来说,UseInternalTransaction似乎是多余的,但为了安全起见,我会设置它.
我试图用CsvHelper读取CSV文件,将每个记录加载到DataTable,然后使用SqlBulkCopy将数据插入数据库表.使用当前代码,在向DataTable添加行时会出现异常.例外情况是:"无法将'MvcStockAnalysis.Models.StockPrice'类型的对象强制转换为'System.IConvertible'.不能存储在日期列中.预期的类型是DateTime."
示例CSV文件来自yahoo finance.例如:http://ichart.yahoo.com/table.csv?s = MMM&a = 0&b = 1&c = 2010&d = 0&e = 17&f = 2014&g = d&signore = .cv
CSV文件包含以下标题:日期打开高低关闭音量调整关闭
我正在将CSV文件读入的模型:
namespace MvcStockAnalysis.Models
{
using System;
using System.Collections.Generic;
public partial class StockPrice
{
public int Id { get; set; }
public System.DateTime Date { get; set; }
public int CompanyId { get; set; }
public double High { get; set; }
public double Low { get; set; }
public double Close { get; set; } …Run Code Online (Sandbox Code Playgroud) 我有一个带记录的数据表.我正在使用SqlBulkCopy将记录插入到Sql表中.它运行正常.下一次获取具有相同记录且几乎没有更改值的数据表时,SqlBulkCopy正在插入另一组记录而不更新以前的详细信息.如何我可以使用SqlBulkCopy更新Sql表吗?请帮忙.
谢谢,Vix
我有一个DataTable大约有100,000条记录的ADO.NET .在此表中有一列 xyID没有值,因为该列是IDENTITY在我的SQL Server数据库中自动生成的.
我需要为其他进程检索生成的ID.我正在寻找一种方法来批量复制DataTable到SQL Server数据库,并在相同的"步骤"内"填充"我DataTable生成的ID.
如何使用SqlBulkCopy类检索插入表中的记录的标识值?