使用临时表进行多次往返?

时间:2011-09-06 06:42:18

标签: asp.net sql sqlperformance

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

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

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

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

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

5 个答案:

答案 0 :(得分:3)

保持简单。从最容易实现的解决方案开始,我认为这是第一个。

然后,您可以测试性能是否足够好,如果您遇到问题,请重新考虑实施。

答案 1 :(得分:1)

有两种方法可以看待它。 1.做什么是容易vs 2.做正确的事情? 第一个选项很简单,但不会给你一个长期解决方案。迟早你会意识到这不是正确的表现,也不是最简单的方法。当您在一台计算机上安装少量用户和所有设置时,这可能会很好。

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

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

答案 2 :(得分:1)

如果尝试实现第二个选项,则字符串本身的长度可能是阻碍。你发送的数据太多了。您解决方案的数据越多越有效。

更多地向DB进行多次调用(解决方案1)也是一种开销。假设多个单元依赖于其他单元的更新,您也可能搞乱事务。

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

答案 3 :(得分:1)

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

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();
            }
        }
    }
}

答案 4 :(得分:1)

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