2009-06-23 78 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, ...) 

就是这样,反正。由于你匿名化了所有的名字,所以我不清楚你的表是如何工作的,但是希望你能理解我所说的内容。


这就是说,如果你不想或不能用这种方式规范化你的表,我同意其他答案。一个是六个,另一个是六个。就个人而言,我会选择第一种方式,并让数据库完成所有繁重的工作。当然,就像在所有的事情中一样,如果表现是非常关键的,那么真正的答案就不是猜测;尝试两种方式,并拿出你的秒表!