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

时间:2012-03-13 17:21:18

标签: sql sql-server-2008 clr database-performance

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

1 个答案:

答案 0 :(得分:0)

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

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