相关疑难解决方法(0)

什么是在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
))
Run Code Online (Sandbox Code Playgroud)

我在平均大约300行的块中插入数据,其中ContainerId和BinId在每个块中是常量,并且Sequence值是0-n,并且值是基于主键预排序的.

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

如果我:它有帮助吗?

  1. 我在插入时删除主键,稍后重新创建它
  2. 插入具有相同模式的临时表并定期将它们传输到主表中,以保持表插入发生的大小
  3. 还要别的吗?

- 根据我得到的答复,让我澄清一下:

Portman:我正在使用聚簇索引,因为当数据全部导入时,我需要按顺序依次访问数据.导入数据时,我并不特别需要索引.在执行插入时是否有任何优势来使用非聚簇PK索引而不是完全删除约束以进行导入?

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

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

c# sql sql-server sql-server-2005

55
推荐指数
5
解决办法
7万
查看次数

删除具有4200万行的表的相关子查询的SQL?

我有一张cats42,795,120行的表.

显然这是很多行.所以当我这样做时:

/* owner_cats is a many-to-many join table */
DELETE FROM cats
WHERE cats.id_cat IN (
SELECT owner_cats.id_cat FROM owner_cats
WHERE owner_cats.id_owner = 1)
Run Code Online (Sandbox Code Playgroud)

查询超时:(

(编辑:我需要增加我的 CommandTimeout 值,默认只有30秒)

我不能用,TRUNCATE TABLE cats因为我不想吹掉其他主人的猫.

我正在使用SQL Server 2005,其中"恢复模式"设置为"简单".

所以,我想做这样的事情(从应用程序btw执行这个SQL):

DELETE TOP (25) PERCENT FROM cats
WHERE cats.id_cat IN (
SELECT owner_cats.id_cat FROM owner_cats
WHERE owner_cats.id_owner = 1)

DELETE TOP(50) PERCENT FROM cats
WHERE cats.id_cat IN (
SELECT owner_cats.id_cat FROM owner_cats
WHERE owner_cats.id_owner = 1)

DELETE FROM cats
WHERE cats.id_cat …
Run Code Online (Sandbox Code Playgroud)

sql sql-server correlated-subquery sql-delete

6
推荐指数
3
解决办法
2万
查看次数