我的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是主要问题,但我得到的速度比原始文件副本低几个数量级.
如果我:它有帮助吗?
- 根据我得到的答复,让我澄清一下:
Portman:我正在使用聚簇索引,因为当数据全部导入时,我需要按顺序依次访问数据.导入数据时,我并不特别需要索引.在执行插入时是否有任何优势来使用非聚簇PK索引而不是完全删除约束以进行导入?
Chopeen:数据是在许多其他机器上远程生成的(我的SQL服务器目前只能处理大约10个,但我希望能够添加更多).在本地计算机上运行整个过程是不切实际的,因为它必须处理50倍的输入数据才能生成输出.
Jason:我在导入过程中没有对表进行任何并发查询,我会尝试删除主键,看看是否有帮助.
假设我有一个存储字节数组的对象,我希望能够为它有效地生成哈希码.我过去曾经使用过加密哈希函数,因为它们很容易实现,但是他们做的工作比他们应该加密的工作要多得多,而且我并不关心(我只是在用它)哈希码作为哈希表的密钥).
这就是我今天所拥有的:
struct SomeData : IEquatable<SomeData>
{
private readonly byte[] data;
public SomeData(byte[] data)
{
if (null == data || data.Length <= 0)
{
throw new ArgumentException("data");
}
this.data = new byte[data.Length];
Array.Copy(data, this.data, data.Length);
}
public override bool Equals(object obj)
{
return obj is SomeData && Equals((SomeData)obj);
}
public bool Equals(SomeData other)
{
if (other.data.Length != data.Length)
{
return false;
}
for (int i = 0; i < data.Length; ++i)
{
if (data[i] != other.data[i])
{
return false;
} …
Run Code Online (Sandbox Code Playgroud) 关于HTML,我最大的印刷挫折之一就是它破坏联合空白的方式.例如,如果我有:
<span>Following punctuation rules. With two spaces after the period. </span>
Run Code Online (Sandbox Code Playgroud)
在此期间之后的两个空格中的一个将被视为无关紧要的空白并被删除.我当然可以通过以下方式强制显示空白:
<span>Following punctuation rules. With two spaces after the period. </span>
Run Code Online (Sandbox Code Playgroud)
但它只是让我不得不这样做,我通常不打扰.有没有人会自动将重要的空白插入到用于网页的外部内容提交中?