我的 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 在每个块中是恒定的,并且序列值是 0-n,并且这些值是根据主键预先排序的。
%Disk time 性能计数器在 100% 上花费了大量时间,因此很明显磁盘 IO 是主要问题,但我得到的速度比原始文件副本低几个数量级。
如果我有帮助:
- 在我进行插入时删除主键并稍后重新创建它
- 插入到具有相同模式的临时表中,并定期将它们转移到主表中,以保持发生插入的表的大小较小
- 还要别的吗?
——根据我得到的答复,让我澄清一下:
Portman:我正在使用聚集索引,因为当数据全部导入后,我需要按顺序依次访问数据。导入数据时,我并不特别需要索引。在进行插入时使用非聚集 PK 索引而不是完全删除约束以进行导入有什么好处?
Chopeen:数据是在许多其他机器上远程生成的(我的 SQL 服务器目前只能处理大约 10 个,但我希望能够添加更多)。在本地机器上运行整个过程是不切实际的,因为它必须处理 50 倍的输入数据才能生成输出。
Jason:在导入过程中,我没有对表进行任何并发查询,我会尝试删除主键,看看是否有帮助。