最近,我们将一组基于C#的复杂调度逻辑转换为SQL CLR存储过程(在SQL Server 2005中运行)。我们认为我们的代码是一个很棒的SQL CLR候选者,因为:
到目前为止,我们sp的结果非常好。但是,由于我们逻辑的输出是几个数据表的形式,我们不能只返回一个行集作为sp的结果。相反,在我们的代码中,我们在foreach循环中有很多“INSERT INTO ....”语句,以便将每个记录从C#泛型集合保存到SQL表中。在代码审查期间,有人担心SQL CLR中的内联SQL INSERT方法是否会导致性能问题,并想知道是否还有其他更好的方法可以将数据转储出来(来自我们的C#泛型集合)。
那么,有什么建议吗?
答案 0 :(得分:2)
几个月前我在SQLite项目上工作时遇到了this,发现它很有启发性。我想这可能就是你要找的东西。
...
插入数据的最快通用方式 使用标准的ADO.NET构造
现在,缓慢的东西已经过时了 方式,让我们谈谈一些铁杆 批量装载。除了SqlBulkCopy 和专门的结构 ISAM或自定义批量插入类 来自其他供应商,简直就是这样 没有击败原始力量 参数化的ExecuteNonQuery() INSERT语句。我将证明:
internal static void FastInsertMany(DbConnection cnn) { using (DbTransaction dbTrans = cnn.BeginTransaction()) { using (DbCommand cmd = cnn.CreateCommand()) { cmd.CommandText = "INSERT INTO TestCase(MyValue) VALUES(?)"; DbParameter Field1 = cmd.CreateParameter(); cmd.Parameters.Add(Field1); for (int n = 0; n < 100000; n++) { Field1.Value = n + 100000; cmd.ExecuteNonQuery(); } } dbTrans.Commit(); } }
答案 1 :(得分:0)
您可以返回一个包含2列(COLLECTION_NAME nvarchar(max),CONTENT xml)的表,其中包含与您拥有的内部集合一样多的行。 CONTENT将是集合中数据的XML表示形式。
然后,您可以使用SQL 2005/2008的XML功能将每个集合的XML解析为表,并在整个表上执行INSERT INTO或MERGE语句。
这应该比C#代码中的单个INSERTS更快。