我的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:在导入过程中,我没有对表进行任何并发查询,我将尝试删除主键,看看是否有帮助。
以下是在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)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。