SQL Server插入并选择需要很长时间

Mun*_*yal 1 sql-server performance

我们有一个大约20列的表,如下所示:

我们需要插入1000条记录,稍后再选择也会产生大约1000条记录.

尝试以两种方式完成插入:

  • 并行通过parallel.For c#loop
  • sql adapter插入填充了1000条记录的整个数据集.

两种情况下的插入都需要30秒以上.我们甚至尝试在干净的桌子上做这件事.怎么加速呢?

[对于普通的10列表,我们已经通过parallel.for在大约60秒内完成了200万条记录插入.]

选择(从SQL mgmt studio测试)返回2000条记录也需要超过30秒,即使在干净的表格中也是如此.

时间可变:

  1. mgmt studio多天运行:17-30秒
  2. 关闭并重新打开 - 第一个选择在1秒内返回. - 2nd和结果选择大约7-10秒来检索所有行.

可变大小或上限固定大小会在列中产生很大差异VARCHAR(SIZE)吗?

[磁盘速度很快(RAID?不确定)并专用于此数据库]

表模式:(没有PK)

varchar(50)
varchar(2)
smallint
varchar(2048)
int
int
varchar(2048)
varchar(MAX)
varchar(MAX)
varchar(MAX)
smallint
varchar(500)
varchar(500)
varchar(MAX)
smallint
smallint
bigint
bigint
bigint
varchar(2048)
smallint
varchar(MAX)
varchar(MAX)
varchar(2048)
datetime
Run Code Online (Sandbox Code Playgroud)

指数:

索引在varchar(50)上,非唯一非群集

SELECT语句:

select * 
from table 
where varchar(50) = 'value1' 
  and varchar(2) = 'value2' 
  and smallint = 'value3'
Run Code Online (Sandbox Code Playgroud)

每个组合varchar(50)都有5个唯一varchar(2)条目,每个条目有varchar(2)1-3 smallint个条目.

Ada*_*Dev 5

看看SqlBulkCopy类.我之前做了一个比较,从.NET到SQL Server的高性能数据加载,比较SqlBulkCopy和SqlDataAdapter与底线,加载100,000行:

SqlDataAdapter:25.0729s
SqlBulkCopy:0.8229s

在这里博客

更新:
就SELECT性能而言,尝试查询的3个字段的索引 - 这将允许执行索引查找.目前,只有VARCHAR(50)上的索引,它将进行扫描.当您执行SELECT*以返回所有列时,它将不得不关闭并查找其他列中的其余数据,因为它们不会包含在索引中.这可能很昂贵,所以你应该考虑不做SELECT*而只返回你实际需要的列(如果你实际上并不需要它们).您真正需要的那些,在SELECT中显式命名,然后您可以在WHERE子句中的3个字段上创建的索引中包含它们.(参见INCSUDE上的MDSN参考:http://msdn.microsoft.com/en-us/library/ms190806.aspx)