相关疑难解决方法(0)

什么是在SQL Server中批量插入大量数据的最快方法(C#客户端)

我的C#客户端将批量数据插入SQL Server 2005数据库时遇到了一些性能瓶颈,我正在寻找加快这一过程的方法.

我已经在使用SqlClient.SqlBulkCopy(它基于TDS)来加速通过线路的数据传输,这有很大帮助,但我仍然在寻找更多.

我有一个简单的表,看起来像这样:

 CREATE TABLE [BulkData](
 [ContainerId] [int] NOT NULL,
 [BinId] [smallint] NOT NULL,
 [Sequence] [smallint] NOT NULL,
 [ItemId] [int] NOT NULL,
 [Left] [smallint] NOT NULL,
 [Top] [smallint] NOT NULL,
 [Right] [smallint] NOT NULL,
 [Bottom] [smallint] NOT NULL,
 CONSTRAINT [PKBulkData] PRIMARY KEY CLUSTERED 
 (
  [ContainerIdId] ASC,
  [BinId] ASC,
  [Sequence] ASC
))
Run Code Online (Sandbox Code Playgroud)

我在平均大约300行的块中插入数据,其中ContainerId和BinId在每个块中是常量,并且Sequence值是0-n,并且值是基于主键预排序的.

%Disk时间性能计数器花费大量时间在100%,因此很明显磁盘IO是主要问题,但我得到的速度比原始文件副本低几个数量级.

如果我:它有帮助吗?

  1. 我在插入时删除主键,稍后重新创建它
  2. 插入具有相同模式的临时表并定期将它们传输到主表中,以保持表插入发生的大小
  3. 还要别的吗?

- 根据我得到的答复,让我澄清一下:

Portman:我正在使用聚簇索引,因为当数据全部导入时,我需要按顺序依次访问数据.导入数据时,我并不特别需要索引.在执行插入时是否有任何优势来使用非聚簇PK索引而不是完全删除约束以进行导入?

Chopeen:数据是在许多其他机器上远程生成的(我的SQL服务器目前只能处理大约10个,但我希望能够添加更多).在本地计算机上运行整个过程是不切实际的,因为它必须处理50倍的输入数据才能生成输出.

Jason:我在导入过程中没有对表进行任何并发查询,我会尝试删除主键,看看是否有帮助.

c# sql sql-server sql-server-2005

55
推荐指数
5
解决办法
7万
查看次数

SSIS的推荐学习材料是什么?

好吧,你不需要成为一名大师,但是如果你碰巧在SSIS上有很好的工作知识,并且你在网上使用了一些教程来帮助你,那么请分享它们.我一直试图找到一些可靠的东西(可能是截屏视频),但我很难过.

任何可靠的链接都将受到赞赏,我将在最后以聚合格式将它们添加到此问题中.谢谢.

到目前为止,我们有:

http://blogs.conchango.com/jamiethomson

http://sqlis.com

sql sql-server ssis

11
推荐指数
1
解决办法
1843
查看次数

将大规模CSV文件上载到SQL Server数据库

我需要将大量(16GB,6500万条记录)CSV文件上传到SQL Server 2005数据库中的单个表.有没有人对最佳方法有任何指示?

细节

我目前正在使用C#控制台应用程序(.NET framework 2.0)将导入文件拆分为50000条记录的文件,然后处理每个文件.我使用SqlBulkCopy类将数据从控制台应用程序上传到数据库中,批量为5000.分割文件大约需要30分钟,上传整个数据集(6500万条记录)大约需要4.5小时.生成的文件大小和批量上载大小都是配置​​设置,我正在研究增加两者的值以提高性能.要运行该应用程序,我们使用具有16GB RAM的四核服务器.该服务器也是数据库服务器.

更新

鉴于到目前为止的答案,请注意在导入之前:

  • 截断数据库表,并删除所有索引和约束.
  • 数据库收缩,磁盘空间被回收.

导入完成后:

  • 索引将重新创建

如果您可以建议任何不同的方法,或者我们可以改进现有导入应用程序的方法,我将不胜感激.谢谢.

相关问题

以下问题可能对处理此问题的其他人有用:

我已经调查了改变批量大小和拆分文件大小的影响,发现500个记录的批次和200,000个记录的拆分文件最适合我的应用程序.使用SqlBulkCopyOptions.TableLock也有帮助.有关详细信息,请参阅此问题的答案.

我还研究了使用SSIS DTS包和BULK INSERTSQL脚本.SSIS包看起来更快,但没有让我能够记录无效记录等BULK INSERT.SQL脚本虽然比SSIS包慢,但比C#应用程序要快得多.它确实允许我记录错误等,因此,我接受BULK INSERT来自ConcernedOfTunbridgeWells的答案作为解决方案.我知道这可能不是面对这个问题的每个人的最佳答案,但它解决了我的直接问题.

感谢所有回复的人.

此致,MagicAndi

.net c# sql-server csv .net-2.0

7
推荐指数
1
解决办法
7171
查看次数

标签 统计

sql-server ×3

c# ×2

sql ×2

.net ×1

.net-2.0 ×1

csv ×1

sql-server-2005 ×1

ssis ×1