【问题标题】:Making multiple round trips vs using a temp table?进行多次往返与使用临时表?
【发布时间】:2011-09-06 06:42:18
【问题描述】:

我需要保存一个包含几列的记录列表。我有两种方法可以做到这一点。

  1. 我可以简单地创建该元素的列表并在代码中多次执行存储过程

    foreach(lstTestInfo 中的TestInfo 测试) {//执行存储过程}

  2. 我可以构建一个字符串并将其发送到数据库,在那里我可以将其拆分并存储在临时表中,然后通过一次往返将其插入那里

虽然这不是一个严重的问题...我想要一些见解。 谢谢!

【问题讨论】:

    标签: asp.net sql sqlperformance


    【解决方案1】:

    保持简单。从最容易以稳健方式实施的解决方案开始,我相信这是第一个。

    然后你可以测试性能是否足够好,如果你有问题重新考虑实现。

    【讨论】:

    • 其实我一直在做第一种方法……但现在我关心的是性能……
    【解决方案2】:

    有两种查看方式。 1. 做容易的事 vs 2. 做正确的事? 第一个选项很简单,但不是可以为您提供长期解决方案的选项。迟早你会意识到它并没有提供正确的性能,它是最简单的方法。当您的用户很少且所有内​​容都设置在一台机器上时,这可能会很好用。

    然而,第二种方法不仅减少了电汇,还最大限度地减少了对数据库的调用。您正在谈论执行意味着将涉及连接的 SP。每次对 DB 的调用都是开销,我们应该尽量减少它。如果您有一个具有 n 层部署的负载平衡环境,那么如果您使用选项 #1,您将无法在另一台服务器上调用 DB。

    我会选择选项 2。这将花费更多时间来实施,但以后会节省我的努力。

    【讨论】:

      【解决方案3】:

      如果您尝试实现第二个选项,字符串本身的长度可能会成为障碍。您发送的数据只有这么多。数据越少,解决方案越有效。

      对数据库进行多次调用(解决方案 1)也是一种开销。假设多个单元格依赖于其他单元格的更新,您也可能会弄乱事务。

      自己决定,这是你需要做出的权衡。

      【讨论】:

      • 您不能从您的应用程序中创建插入/更新语句并执行它吗?除非你坚持写一个 proc 来做插入/更新
      【解决方案4】:

      我会保持简单,使用单个连接和命令来有效地传递数据。可以使用其他复杂的技术,但我认为不会带来太多好处,并且会弄乱你的 sproc。

      public void UpdateUserItems(Guid userId, string[] items)
      {
          using (SqlConnection conn = new SqlConnection("connectionstring..."))
          {
              using (SqlCommand cmd = new SqlCommand("Insert Into UserItems(UserId, Items) values (@UserId, @Items)"))
              {
                  conn.Open();
                  cmd.Parameters.AddWithValue("@UserId", userId);
                  foreach(string item in items)
                  {
                      cmd.Parameters.AddWithValue("@Item", Item;
                      cmd.ExecuteNonQuery();
                  }
              }
          }
      }
      

      【讨论】:

        【解决方案5】:

        这是一个常见问题,有很多可能的答案。例如,您是否考虑过[多个可选参数? This article by Joe Celko 涵盖了此选项,还提供了指向 Erland Sommarskog 关于该主题的“经典”文章的链接。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-21
          • 2019-03-25
          • 2015-04-02
          • 2013-10-20
          • 1970-01-01
          • 2016-07-19
          • 1970-01-01
          • 2017-07-11
          相关资源
          最近更新 更多