【问题标题】:Any Best practice of doing table record insert with SQL CLR store procedure?使用 SQL CLR 存储过程进行表记录插入的任何最佳实践?
【发布时间】:2009-07-21 14:15:26
【问题描述】:

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

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

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

那么,有什么建议吗?

【问题讨论】:

    标签: sqlclr


    【解决方案1】:

    几个月前,我在做一个 SQLite 项目时遇到了this,发现它很有启发性。我想这可能就是你要找的东西。

    ...

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

    现在慢的东西已经过时了 方式,让我们谈谈一些铁杆 批量装载。除了 SqlBulkCopy 和专门的构造涉及 ISAM 或自定义批量插入类 从其他供应商那里,很简单 没有击败的原始力量 对参数化的 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();
    
        }
    
    }
    

    【讨论】:

    • 简单引用外部资源的答案并没有那么有用。我更希望您包含外部链接的摘要,以防链接损坏。如果您包含摘要,您的答案仍然有价值。
    • 在我的代码上尝试了代码,伙计,它有很大的不同!谢谢!我确实使用 DBTransaction 将表单更改为 SQLTransaction。顺便说一句,我发现代码在事务中运行得更快很奇怪,因为我明确地尝试注释掉事务语句,并且代码运行得更慢。我想知道为什么。
    • 针对 SQL 数据库运行的语句在事务中隐式运行。通过声明事务,您有效地将所有语句批处理在一起,因此 SQL Server 不会为每个语句启动单独的事务。我想,除此之外,SQL 还可以进一步优化内部流程,例如更新索引,方法是将它们推迟到事务中的所有语句完成之后。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2020-02-11
      相关资源
      最近更新 更多