簡體   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