1

最近我们将一组基于 C# 的复杂调度逻辑转换为 SQL CLR 存储过程(在 SQL Server 2005 中运行)。我们相信我们的代码是一个很好的 SQL CLR 候选,因为:

  • 该逻辑涉及大量来自 SQL Server 的数据。
  • 逻辑复杂,使用 TSQL 难以完成
  • 没有线程或同步或从沙箱外部访问资源。

到目前为止,我们的 sp 的结果非常好。但是,由于我们的逻辑输出是多张数据表的形式,我们不能只返回单个行集作为 sp 的结果。相反,在我们的代码中,我们在 foreach 循环中有很多“INSERT INTO ....”语句,以便将 C# 通用集合中的每条记录保存到 SQL 表中。在代码审查期间,有人担心 SQL CLR 中的内联 SQL INSERT 方法是否会导致性能问题,并想知道是否有其他更好的方法来转储数据(来自我们的 C# 通用集合)。

那么,有什么建议吗?

4

2 回答 2

2

几个月前,我在做一个 SQLite 项目时遇到了这个问题,发现它很有启发性。我想这可能是你正在寻找的。

...

使用标准 ADO.NET 结构插入数据的最快通用方法

现在慢的东西已经不碍事了,让我们谈谈一些核心批量加载。除了 SqlBulkCopy 和涉及 ISAM 的特殊构造或来自其他提供程序的自定义批量插入类之外,在参数化的 INSERT 语句中,ExecuteNonQuery() 的原始功能是无可匹敌的。我将演示:

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();

    }

}
于 2009-07-21T03:05:56.830 回答
0

您可以返回一个包含 2 列 (COLLECTION_NAME nvarchar(max), CONTENT xml) 的表,其中包含与您拥有的内部集合一样多的行。CONTENT 将是集合中数据的 XML 表示。

然后,您可以使用 SQL 2005/2008 的 XML 特性将每个集合的 XML 解析为表,并对整个表执行 INSERT INTO 或 MERGE 语句。

这应该比 C# 代码中的单个 INSERTS 更快。

于 2009-07-21T06:15:26.200 回答