我遇到了一些性能瓶颈,我的C#客户端将批量数据插入到SQL Server 2005数据库中,我正在寻找方法加快这一进程。在SQL Server中批量插入大量数据的最快方法是什么(C#客户端)
我已经在使用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行,其中数据筒和BinId是在每个块和序列值恒定块插入数据0-n的并根据主键对值进行预先排序。
%磁盘时间性能计数器花了很多时间在100%,所以很明显磁盘IO是主要问题,但我得到的速度比原始文件副本低几个数量级。
它是否帮助任何如果我:
- 删除主键,而我做的插入,并重新创建后
- 执行插入到一个临时表具有相同的架构,并定期将其转移到主表保持插入正在发生的表的大小小
- 还有其他吗?
- 根据我得到的答复,让我澄清一点:
波特曼:我使用了一个聚集索引,因为当数据被所有进口我需要访问数据按顺序依次进行。在导入数据时,我并不特别需要索引。在执行插入操作时使用非聚集PK索引有什么好处,而不是完全放弃导入的约束? Chopeen:数据正在许多其他机器上远程生成(我的SQL服务器目前只能处理大约10个数据,但我希望能够添加更多数据)。在本地机器上运行整个过程是不实际的,因为它将不得不处理50倍的输入数据来生成输出。
Jason:我没有在导入过程中对表进行任何并发查询,我会尝试删除主键,看看是否有帮助。
http://msdn.microsoft.com/en-us/library/ms174335.aspx – JohnB 2010-05-24 18:59:09