开发者社区> 问答> 正文

在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
))

我将数据插入平均约300行的数据块中,其中每个数据块中的ContainerId和BinId都是常数,并且Sequence值为0-n,并且这些值基于主键进行了预排序。

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

如果我这样做有帮助吗?

插入时放下主键,稍后再创建 将插入到具有相同架构的临时表中,并定期将它们转移到主表中,以保持发生插入的表的大小较小 还要别的吗? -根据我得到的答复,让我澄清一下:

波特曼:我使用的是聚集索引,因为当数据全部导入后,我将需要按该顺序顺序访问数据。在导入数据时,我特别不需要索引存在。与完全删除导入约束相比,在执行插入操作时具有非聚集PK索引有什么优势吗?

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

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

展开
收起
心有灵_夕 2019-12-25 21:08:28 1589 0
1 条回答
写回答
取消 提交回答
  • 以下是在SQL Server中禁用/启用索引的方法:

    --Disable Index ALTER INDEX [IX_Users_UserID] SalesDB.Users DISABLE GO --Enable Index ALTER INDEX [IX_Users_UserID] SalesDB.Users REBUILD 这里有一些资源可以帮助您找到解决方案:

    一些批量加载速度比较

    使用SqlBulkCopy将数据从客户端快速加载到SQL Server

    优化批量复制性能

    绝对要看看NOCHECK和TABLOCK选项:

    表提示(Transact-SQL)

    插入(Transact-SQL)

    2019-12-25 21:08:46
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载