-4

我怎样才能获得最快的性能?我总是在客户端应用程序上使用计算而不是在程序中进行计算。我有一个大约 10,000 行的表来评估。该数据库位于托管 Web 服务器中,我一直在读取所有行并在我的应用程序的数据网格中显示。

因此,在读取“ProductPrice”和“ProductQty”列的过程中,我可以计算 ProductPrice * Qty 并将其存储在应用程序的另一列中,考虑到要流式传输的数据较少。

以下哪个会更快?

SqlCommand sqlCmdTxt = new SqlCommand(conn);
SqlDataReader sqlRead;

sqlCmdTxt.commandText = "Select ProductPrice, ProductQty, ProductPrice * ProductQty As Total From Stock";
sqlRead = sqlCmdTxt.ExecuteReader();
while (
sqlRead.Read()) {
    double price = sqlRead.GetDouble(0);
    double qty = sqlRead.GetDouble(1);
    double sum = price * qty;

    dataGridView.rows.add (new object[] {price, qty, sum});
}

或者

SqlCommand sqlCmdTxt = new SqlCommand(conn);
DataSet dSet = new DataSet();
new SqlDataAdapter(new SqlCommand("Select ProductPrice, ProductQty, ProductPrice * ProductQty As Total From Stock"
    , conn)).Fill(dSet, "StockList");
dataGridView.DataSource = dSet.Tables["StockList"].DefaultView;
4

4 回答 4

6

计算本身可能无关紧要(无论是在服务器还是客户端上完成)。更重要的是物理数据检索(查询执行计划、缓存、集群、分区等)以及从服务器到客户端的数据传输。

在这种特殊情况下,您在两种情况下都使用相同的查询,因此我希望在客户端进行计算只会在任何情况下查询本身所需的时间增加(非常少)时间。

然而,如果你有...

Select ProductPrice, ProductQty From Stock

...相对...

Select ProductPrice * ProductQty As Total From Stock

...我希望第二个稍微快一点:传输(从服务器到客户端)一堆较大的 2 字段元组(对于第一个查询)可能比传输相同数量的较小 1-字段元组(用于第二个查询)。除此之外,它会消耗更多的可用网络带宽,影响其他并发客户端。

而且,如果您需要以任何方式过滤1数据,则使用服务器端WHERE可能比将所有行获取到客户端以丢弃那里的大部分行要快得多如果您对数据库性能的主题感兴趣,我强烈建议您看看:Use The Index,Luke!

建议:

  • 你的“默认”位置应该是尽可能多地在服务器上做。
  • 如果有疑问,不要猜测,而是测量具有代表性的数据量(50000 行在数据库术语中几乎不能称为“大”)。

1或聚合 ( SUM, AVG, MAX...) 或JOIN等...

于 2013-10-11T10:49:13.323 回答
3

我的意见是在服务器上进行所有计算 - 它肯定更快。

如果您为 SQL Server 使用较慢的计算机,则在服务器上运行的结果可能会更差。如果您在同一台机器上运行它,我更喜欢使用 SQL Server。

于 2013-10-11T09:57:15.743 回答
1

一般来说,存储过程更好——它不仅从客户端抽象出底层 DB 模式(为您提供更多数据层的 API 方法),而且它允许 SQL 引擎操作数据并仅将结果返回给您.

正如 Branko 所说,减少的数据传输可能很重要,但还要查看您的代码:您不仅在执行相同的旧乘法运算,而且还在运行客户端驱动程序获取并将值转换为双精度值。这意味着您不仅可以从 DB 中获取数据,将其弹出到缓冲区中,然后将该缓冲区传输到客户端,还可以将缓冲的数据读取为您自己的字符串,然后进行转换。所有这些小的代码层和缓冲区操作都可以加起来,尤其是当您不知道在 sql 读取调用中创建了哪种临时缓冲区来为您提供值时。

sql存储过程也完全有可能通知您要将数据转换为双倍并提供隐藏的双倍存储,其中包含为您预先转换的数据;如果它知道你想要什么(并且 SP 总是知道你告诉它),它也可以提供很多缓存,所以你第二次点击那个 SP,它只是返回未更改数据的先前结果。

于 2013-10-11T11:14:17.857 回答
0

您的 C# 代码可能会更快,因为在 SQL 引擎和您的应用程序之间传输的数据更少。对于 50K 行,这不是很重要,但更大的行和表可以节省传输成本,这可能是通过慢速网络,可以产生显着的差异。

此 SQL 第二次在您的服务器上运行时,SQL 可能已经缓存了结果。所以它可能会更快(更少的计算),但你仍然会得到转移成本。

于 2013-10-11T10:13:20.183 回答