代码之家  ›  专栏  ›  技术社区  ›  AdaTheDev

将数据库更新从datatable/sqldataadapter中最小化

  •  1
  • AdaTheDev  · 技术社区  · 15 年前

    我的目标是最大限度地提高绩效。场景的基本内容包括:

    • 我将SQL Server 2005中的一些数据读取到数据表中(1000条记录x 10列)
    • 我在.NET中对数据进行了一些处理,所有记录的数据表中至少有一个字段发生了更改,但可能所有10个字段都会发生更改。
    • 我还将一些新记录添加到数据表中
    • 我执行sqldataadapter.update(mydataTable.getChanges())以使用在开始时定义的insertCommand和updateCommand将更新(插入)持久化回数据库
    • 假设正在更新的表包含1000万条记录

    这很好。但是,如果数据表中的某一行发生了更改,则该记录的所有列都将在数据库中更新,即使9列中只有1列实际更改了值。这意味着不必要的工作,特别是在涉及索引的情况下。我不相信SQL Server会优化这个场景?

    我认为,如果我只能更新为任何给定记录实际更改的列,我应该会看到显著的性能改进(尤其是累积处理数百万行)。

    我发现这篇文章: http://netcode.ru/dotnet/?lang=&katID=30&skatID=253&artID=6635 但不喜欢在存储过程中进行多个更新。 除了为每个已更改的数据行创建单独的更新语句,然后以某种方式批量触发它们之外,我还在寻找其他人的经验/建议。

    (请假设我不能使用触发器)

    提前谢谢

    编辑: 有什么方法可以让sqldataadapter发送特定于每个已更改数据行的update语句(只更新该行中的实际已更改列),而不提供更新所有列的常规.updateCommand?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Frederik Gheysels    15 年前

    在实现此功能的地方,是否可以实现自己的IDataAdapter?

    当然,dataadapter只触发正确的sqlcommand,这由每个datarow的rowstate决定。 所以,这意味着您必须生成必须针对每个情况执行的SQL命令…


        2
  •  0
  •   Mladen Prajdic    15 年前

        3
  •  0
  •   pero    15 年前

    假设您有1000万条记录需要更新。我们假设每条记录都有100个字节(对于10个列来说,这可能太小,但要保守一点)。这相当于CCA 100 MB的数据,必须从数据库(网络流量)传输,存储在内存中,然后以更新或插入的形式返回到数据库,这些更新或插入对于传输到数据库来说要冗长得多。

    我希望SP的性能会更好。

    此外,您可以将工作划分为较小的SP(从主SP调用),它只更新必要的字段,从而获得额外的性能。

    禁用索引/约束也是一个选项。

    编辑:
    您必须考虑的另一件事是不同的update语句的潜在数量。如果每行有10个字段,则任何字段都可以保持不变或更改。因此,如果构造update语句来反映这一点,则可能会得到10^2=1024个不同的update语句,其中任何一个语句都必须由SQL Server解析,执行计划计算并解析存储在某些区域中的语句。这样做是有代价的。