Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何加速此C#函数/SQL插入?_C#_.net_Sql_Sql Server - Fatal编程技术网

如何加速此C#函数/SQL插入?

如何加速此C#函数/SQL插入?,c#,.net,sql,sql-server,C#,.net,Sql,Sql Server,此代码序列化整数数组,然后将其插入sql表中。它没有我需要的那么快。我能做些更有效率的事吗 谢谢 public void SetItem(long Id, int[] items) { using (MemoryStream stream = new MemoryStream()) { foreach (int d in items) { var bin = BitCo

此代码序列化整数数组,然后将其插入sql表中。它没有我需要的那么快。我能做些更有效率的事吗

谢谢

    public void SetItem(long Id, int[] items)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            foreach (int d in items)
            {
                var bin = BitConverter.GetBytes(d); //Serialize
                stream.Write(bin, 0, bin.Length);
            }
            var array = stream.ToArray();

            using (SqlCommand cmd = new SqlCommand("INSERT INTO Items(Id, Item, DateCreated) VALUES (@Id, @binaryValue, @dateCreated)", sqlConnection))
            {
                cmd.Parameters.Add("@binaryValue", SqlDbType.VarBinary, array.Length).Value = array;
                cmd.Parameters.Add("@Id", SqlDbType.BigInt).Value = Id;
                cmd.Parameters.Add("@dateCreated", SqlDbType.DateTime2).Value = DateTime.Now;
                cmd.ExecuteNonQuery();
            }
        }
    }

我要尝试的第一件事是为内存流预分配
字节[]

var array = new int[BitConverter.GetBytes(0).Length * items.Length];
using (MemoryStream stream = new MemoryStream(array))
{
    // ... rest is almost the same
}

我建议你把这个函数一分为二。一个用于字节数组,另一个用于插入数据库

然后运行评测,看看字节数组代码是否太慢,或者是db问题


也许您正在尝试加速一些不慢的东西:)

您可以使用insert命令创建一个过程。因为已经为Sql编译了过程,所以速度更快

大概是这样的:

    SqlConnection conn = new SqlConnection(actual_string);
conn.Open();

// Create the command string
SqlCommand cmd = new SqlCommand("EXEC insert_test @var1, @var2, @var3, @str1, @str2", conn);

// Iterate through all of the objects
try {
    for (int i = 0; i < 10000; i++) {
        cmd.Parameters.Clear();
        cmd.Parameters.Add(new SqlParameter("@var1", var1));
        cmd.Parameters.Add(new SqlParameter("@var2", var2));
        cmd.Parameters.Add(new SqlParameter("@var3", var3));
        cmd.Parameters.Add(new SqlParameter("@str1", str1));
        cmd.Parameters.Add(new SqlParameter("@str2", str2));

        // Read in all the data
        cmd.ExecuteNonQuery();
    }
} finally {
    conn.Close();
}
SqlConnection conn=新的SqlConnection(实际字符串);
conn.Open();
//创建命令字符串
SqlCommand cmd=newsqlcommand(“EXEC insert_test@var1、@var2、@var3、@str1、@str2”,conn”);
//遍历所有对象
试一试{
对于(int i=0;i<10000;i++){
cmd.Parameters.Clear();
cmd.Parameters.Add(新的SqlParameter(“@var1”,var1));
cmd.Parameters.Add(新的SqlParameter(“@var2”,var2));
cmd.Parameters.Add(新的SqlParameter(“@var3”,var3));
cmd.Parameters.Add(新的SqlParameter(“@str1”,str1));
cmd.Parameters.Add(新的SqlParameter(“@str2”,str2));
//读入所有数据
cmd.ExecuteNonQuery();
}
}最后{
康涅狄格州关闭();
}
但我更喜欢向过程发送XML


如果插入大量行,则可以从中看到更多内容,
SqlBulkCopy
类比多次调用
insert
要快得多。看看这个。

我的第一个倾向是预先分配一个数组供
内存流
使用,然后使用
二进制编写器
对其进行写入:

var OutputArray = new byte[items.Length * 4];
using (var ms = new MemoryStream(OutputArray))
{
    using (var writer = new BinaryWriter(ms))
    {
        foreach (var i in items)
        {
            writer.Write(i);
        }
    }
}
// You can now send the OutputArray to SQL server

BinaryWriter
在内部不使用
BitConverter.GetBytes
。相反,它从
int
中一次提取一个字节,并将它们放在缓冲区中。然后将缓冲区写入流<另一方面,code>BitConverter每次调用时都会分配一个新的4字节缓冲区。

您是否尝试过在MemoryStream周围包装一个BinaryWriter,而不是使用BitConverter?另外,既然最终将其转换为数组,为什么要使用流而不是数组?您已经知道大小(items.Count*4)sqlConnection是私有变量吗?是的,sqlConnection是一个prvate变量。我听说BinaryWriter在内部使用BitConverter.GetBytes()。数组的有趣之处。我会调查一下的,谢谢。@user404068:发布的代码在我看来不会运行得太慢。您是否多次调用SetItem?您是重复使用sqlConnection还是每次都打开一个新连接。您能提供一些时间,来说明第一个块(在哪里转换数据)和第二个块(在哪里写入数据库)执行时间?可能是转换速度快,写入时间长(例如,由于表上的索引)。。。他只做了一次插入