【问题标题】:Sql Processing vs. ASP.NET Runtime processingSql 处理与 ASP.NET 运行时处理
【发布时间】:2009-06-23 02:14:01
【问题描述】:

我知道一般来说,将尽可能多的处理从 Sql Server 转移到应用程序(在我的例子中是 ASP.NET)是一个好习惯。但是,如果应用程序级别的处理意味着将 30 多个额外参数传递给 Sql Server,该怎么办。在这种情况下,是否值得将处理移至 Sql Server?

这是我面临的具体困境 - 哪个程序会提供更好的整体性能?

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。因此,每当我的网络应用程序的用户为 itemN 提供新评级时,totalNumberOfRatingsItemN 就会增加 1。在大多数情况下,评级将给予多个项目(但不一定是全部),因此不同项目的 totalNumberOfRatings 是不一样的。

【问题讨论】:

  • 您要增加的这 30 多个值是什么?这可能表明您的数据库架构需要改进。

标签: asp.net sql sql-server-2008


【解决方案1】:

我会大胆猜测您已经读到 SQL Server 不是进行数学计算的合适场所。我认为 SQL 非常适合做一些算术运算和聚合运算,比如 SUM。只有在实际负载场景中测量这两种实现才能确定。

SQL 不适用于多元回归和矩阵求逆。

在我看来,将增量器移动到应用程序层听起来像是一种不太可能收回成本的微优化。实现逻辑以增加任一层中的值,使代码可读和可维护。

【讨论】:

    【解决方案2】:
    一般来说,将尽可能多的处理从 Sql Server 转移到应用程序是一种很好的做法

    说谁? SQL Server 擅长某些事情,但不擅长其他事情。运用你的判断力。

    你所说的“应用程序”是指

    • 网页
    • 应用服务层
    • 企业服务总线组件
    • 网络服务
    • 还有别的吗?

    有很多选择...

    至于您的具体问题,增加 30 个字段似乎很可笑。通过 30 parms 似乎有些过分。一些上下文是有序的......

    【讨论】:

      【解决方案3】:

      在这种情况下,性能是否那么重要?如果不是,我个人会追求可读性和可维护性——这意味着按照与系统其他部分相同的标准来实施它。

      【讨论】:

        【解决方案4】:

        我建议对您的表格进行规范化,以消除 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, ...)
        

        反正就是这样。由于您匿名了所有名称,因此我不太清楚您的表格如何运作,但希望您能明白我所说的要点。


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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-20
          相关资源
          最近更新 更多