SqlBulkCopy与TVP与XML参数与单个插入过程为20-200个插入?

时间:2011-12-23 16:19:56

标签: .net tsql stored-procedures

在.Net Aspx页面或Web服务需要在表格中执行大约20-200行插入的情况下,您会推荐以下哪种方法?为什么?小的性能提升可能意味着我仍然会使用我最熟悉的方法,所以请告诉它是否会产生很大的不同。任何关于何时使用一个而非另一个真正有意义的一般指导将不胜感激。

  1. 表值参数
  2. SqlBulkCopy类
  3. 存储过程中的XML参数并使用XQuery
  4. 二十到二百个单独插入存储过程调用
  5. 其他注意事项:每个插入所需的逻辑处理量各不相同,但可以假设几乎不需要。我最感兴趣的是,对于这些小批量插入的四种选择之一,每天可以重复几十到几百次,可能会有大量的性能/易用性/其他好处。

3 个答案:

答案 0 :(得分:9)

对于如此少量的行,我个人会选择Table Valued Parameters - 这是他们最好的用途之一。

SqlBulkCopy更像是更大量数据和多个表格的主力。

XML参数将是处理器密集型的,而且XML仍然不像TVP那样是SQL Server的原生参数。

到目前为止,多次插入是最糟糕的选择 - 200次连接,200次交易等...


关于哪个选项表现最佳的真正答案取决于您的具体情况。您需要测试所有方法,并为您选择最好的方法。

答案 1 :(得分:2)

或者另一种选择是,如果您的安全实践允许直接表插入。

    Insert into insertTable with (tablock) (Col1, Col2) 
    values ('1a', '2a), ('1b','2b')  

您最多可以拥有1000个值。我做了很多,它是我发现的最快的原始插入(除了bcp,但在ASP中,实时数据库很乱)。

如果insertTable具有PK,则对PK上的值进行排序以最小化表分割。数据存在很大的差距然后这不会有太大帮助,但它不会受到伤害。对于PK的初始负载排序是巨大的。

维护insertTable上的索引并留下适当的填充因子。

使用(tablock)会影响其他用户但我发现的是,你进出的速度低于1000,这是最佳的。

我也喜欢Oded的TVP回答。排序和维护索引应该  也帮助TVP。

答案 2 :(得分:2)

这实际上取决于有多少用户同时访问此页面。如果您只有1个用户提交数据,那么简单的插入将正常工作,因为插入可以说是数据库中最快的操作。假设用户不需要立即反馈,您可以将数据发送到队列以便稍后处理。