我的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是主要问题,但我得到的速度比原始文件副本低几个数量级.
如果我:它有帮助吗?
- 根据我得到的答复,让我澄清一下:
Portman:我正在使用聚簇索引,因为当数据全部导入时,我需要按顺序依次访问数据.导入数据时,我并不特别需要索引.在执行插入时是否有任何优势来使用非聚簇PK索引而不是完全删除约束以进行导入?
Chopeen:数据是在许多其他机器上远程生成的(我的SQL服务器目前只能处理大约10个,但我希望能够添加更多).在本地计算机上运行整个过程是不切实际的,因为它必须处理50倍的输入数据才能生成输出.
Jason:我在导入过程中没有对表进行任何并发查询,我会尝试删除主键,看看是否有帮助.
好吧,你不需要成为一名大师,但是如果你碰巧在SSIS上有很好的工作知识,并且你在网上使用了一些教程来帮助你,那么请分享它们.我一直试图找到一些可靠的东西(可能是截屏视频),但我很难过.
任何可靠的链接都将受到赞赏,我将在最后以聚合格式将它们添加到此问题中.谢谢.
到目前为止,我们有:
我需要将大量(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