2009-06-23 130 views
0

我知道一般來說,將盡可能多的處理從Sql Server移動到應用程序(在我的情況下爲ASP.NET)是一種很好的做法。但是,如果應用程序級別的處理意味着將30多個額外參數傳遞給Sql Server,會怎麼樣?在這種情況下,將處理移到Sql Server是否值得?Sql處理與ASP.NET運行時處理

下面是我面對的具體困境 - 哪個程序將提供更好的整體表現?

CREATE PROCEDURE MyProc1 
    @id int 
AS BEGIN 
    UPDATE MyTable 
    SET somevalue1 = somevalue1 + 1, 
     somevalue2 = somevalue2 + 1, 
     somevalue3 = somevalue3 + 1, 
     ... 
     somevalueN = somevalueN + 1 
    WHERE id = @id 
END 

或者

CREATE PROCEDURE MyProc2 
    @id int, 
    @somevalue1 int, 
    @somevalue2 int, 
    @somevalue3 int, 
    ... 
    @somevalueN int 
AS BEGIN 
    UPDATE MyTable 
    SET somevalue1 = @somevalue1, 
     somevalue2 = @somevalue2, 
     somevalue3 = @somevalue3, 
     ... 
     somevalueN = @somevalueN 
    WHERE id = @id 
END 

我使用的是主機託管,但我想它是有效的假設,SQL Server和ASP.NET運行時駐留在同一臺機器上,所以數據之間的傳輸這兩個可能會相當快/可以忽略不計(或者是)。


30個參數基本上是針對不同項目的totalNumberOfRatings。因此,無論何時我的Web應用程序的用戶給出itemN的新評級,那麼totalNumberOfRatingsItemN都會增加1.在大多數情況下,評分將被賦予多個項目(但不一定全部),所以totalNumberOfRatings對於不同項目而言並不相同。

+0

你正在增加的這30多個值是什麼?這可能表明您的數據庫模式需要改進。 – 2009-06-23 02:17:05

回答

2

我會猜測你已經讀過SQL Server不適合做數學的地方。我認爲SQL對於執行一些算術運算和聚合操作(如SUM)非常合適。只有在實際負載情況下測量這兩種實現才能肯定地說。

SQL不適合用於多重回歸和矩陣求逆等。

將遞增器移動到應用程序層聽起來像是一種微不足道的優化。實現邏輯來增加任何層中的值,使代碼可讀和可維護。

1

在這種情況下,性能至關重要嗎?如果不是,我會親自去做可讀性和可維護性 - 這意味着要按照與系統其他部分相同的標準來實施它。

2
一般是從SQL Server移動儘可能多的處理,儘可能應用

說的是誰的好做法? SQL Server擅長某些事情,不擅長其他事情。使用你的判斷。

和 「應用」,你的意思

  • 網頁
  • 應用服務層
  • 企業服務總線組件
  • Web服務
  • 別的東西嗎?

有很多選擇......

至於您的具體問題,增加30場看起來很荒唐。傳球30次似乎過分。有些上下文是爲了...

1

我建議您規範化表格以消除30列以上的評分。相反,考慮與收視率的一個列的表,並具有一行對每個不同的項目,就像這樣:

CREATE TABLE ItemRatings 
(
    myTableId INT NOT NULL, -- Foreign key 
    itemNumber INT NOT NULL, 
    itemRating INT 
); 

你可以再一次增加了一堆的收視率與查詢像

UPDATE ItemRatings 
    SET itemRating = itemRating + 1 
WHERE myTableId = @id 
     AND itemNumber IN (@n1, @n2, @n3, ...) 

就是這樣,反正。由於你匿名化了所有的名字,所以我不清楚你的表是如何工作的,但是希望你能理解我所說的內容。


這就是說,如果你不想或不能用這種方式規範化你的表,我同意其他答案。一個是六個,另一個是六個。就個人而言,我會選擇第一種方式,並讓數據庫完成所有繁重的工作。當然,就像在所有的事情中一樣,如果表現是非常關鍵的,那麼真正的答案就不是猜測;嘗試兩種方式,並拿出你的秒錶!