Sql 从CLR存储过程内部插入行的性能

Sql 从CLR存储过程内部插入行的性能,sql,sql-server-2008,clr,database-performance,Sql,Sql Server 2008,Clr,Database Performance,我有一个用C#编写的SP,它可以计算大约200万行。计算大约需要3分钟。对于每一行,结果以三个数字的形式生成。 这些结果被插入到临时表中,然后以某种方式进行处理。 结果以块的形式添加,插入有时需要超过200分钟(是的,超过3小时!)。有时“只”需要50分钟。 我对它进行了修改,结果一直保存在内存中,直到最后,然后在一个事务中的一个循环中转储整个200万。不过,大约需要20分钟。 使用SQL编写的类似循环,事务开始/提交只需不到30秒。 有人知道问题出在哪里吗? 处理200万(因此选择它们等)需要

我有一个用C#编写的SP,它可以计算大约200万行。计算大约需要3分钟。对于每一行,结果以三个数字的形式生成。 这些结果被插入到临时表中,然后以某种方式进行处理。 结果以块的形式添加,插入有时需要超过200分钟(是的,超过3小时!)。有时“只”需要50分钟。 我对它进行了修改,结果一直保存在内存中,直到最后,然后在一个事务中的一个循环中转储整个200万。不过,大约需要20分钟。 使用SQL编写的类似循环,事务开始/提交只需不到30秒。 有人知道问题出在哪里吗? 处理200万(因此选择它们等)需要3分钟,将结果插入最佳解决方案需要20分钟。
更新:此表在标识列上有一个聚集索引(以确保在末尾实际追加行),没有触发器,没有其他索引,也没有其他进程访问它

只要我们都很模糊,这里就有一个模糊的答案。如果插入2mil行需要那么长的时间,我将按以下顺序检查四个问题:

  • 验证外键引用或唯一性约束。你不应该在临时桌上放这些东西。在记录进入插入步骤之前,在CLR中进行验证
  • 复杂的触发器。请告诉我临时表上没有任何触发器。完成插入,然后在所有内容都完成后进行更多处理
  • 尝试在每次插入后重新计算索引。尝试在插入步骤之前删除索引,然后在插入步骤之后重新创建索引
  • 如果不是这样,您可能正在处理记录锁定。您是否有其他可能会妨碍临时表的进程?你能在插入过程中阻止它们吗

  • 没有外键或任何约束,标识列上的聚集索引(确保所有记录都追加到末尾)此表上没有nay类型的触发器,没有其他索引,没有其他进程正在访问此表。这是一个临时表,稍后用于更新原始表中的200万行。