繁体   English   中英

减少数据库调用次数

[英]Reduce number of database calls

我有一个stored-procedure ,该stored-procedure接受五个参数并在表上执行更新

Update Table
Set field = @Field
Where col1= @Para1 and Col2=@Para and Col3=@Para3 and col4 =@aPara4

从用户的角度来看,您可以为所有条件参数选择多个值。 例如,您可以选择2个需要匹配数据库表中Col1的选项(需要以@ Para1的形式传递)

因此,我将所有选择的值存储在单独的列表中。

目前,我正在使用foreach循环进行更新

  foreach (var g in _list1)
            {
                foreach (var o in _list2)
                {
                    foreach (var l in _list3)
                    {
                        foreach (var a in _list4)
                        {
                           UpdateData(g, o, l,a);
                        }
                    }
                }
            }

我肯定这不是一个好方法,因为这将调用数据库调用的号码。 有什么方法可以忽略循环并执行最少数量的db调用来达到相同的结果?

更新

我正在寻找Table-Valued Parameters以外的其他方法

一种可能的方法是使用表值参数将每个条件的多个值传递给存储过程。 这将减少代码中的循环,并且仍应提供所需的功能。

如果我没有记错的话,它们是在SQL Server 2008中引入的,所以只要您不必支持2005或更早版本,它们就可以使用。

考虑将Enterprise Library中的MS Data Access Application Block用于UpdateDataSet命令。

本质上,您将构建一个数据表,其中每一行都是一个参数集,然后针对打开的连接执行参数集的“批处理”。

当然,您可以通过构建一个包含多个更新命令的字符串并针对数据库执行该操作而无需执行此操作。

由于表值参数不适合您使用,因此您可以考虑使用基于XML的方法:

  • 构建一个XML文档,其中包含您要传递的四列。
  • 更改存储过程的签名以接受单个XML值参数,而不是四个标量参数
  • 更改存储过程的代码,以根据获取的XML执行更新
  • 使用您在内存中使用四个嵌套循环构造的XML调用一次新的存储过程。

这将减少往返次数,并加快整体执行时间。 这里是指向文章链接,该文章解释了如何使用XML一次插入许多行; 您的情况有些相似,因此您应该能够使用该文章中概述的方法。

您可以将查询带入此表单:

Update Table Set field = @Field Where col1 IN {} and Col2 IN {} and Col3 IN {} and col4 IN {}

并以这种方式传递参数: https : //stackoverflow.com/a/337792/580053

只要您可以自由更新存储过程的结构; 我建议的方法是使用表值参数而不是多个参数。

可以在以下位置找到服务器和数据库代码的一个很好的示例: http : //www.codeproject.com/Articles/39161/C-and-Table-Value-Parameters

为什么要为此使用存储过程? 我认为您不应该使用SP来执行简单的CRUD操作。 存储过程的真正功能是进行繁重的计算等。

表值参数是我的选择,但是既然您正在寻找其他方法,为什么不采用更简单的方法,而只是在服务器端代码上动态构建批量/批量更新查询并针对数据库运行它?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM