【问题标题】:C# code and SQL Server 2008 stored procedure performance comparisonC#代码与SQL Server 2008存储过程性能对比
【发布时间】:2012-04-03 05:57:00
【问题描述】:

我正在使用 C#、.NET 3.5 框架和 SQL Server 2008 R2 开发一个高频交易应用程序。我订阅了 70 种乐器,我为每种乐器存储了 1 分钟的柱状图。每个仪器的每个条形图由Open PriceHigh PriceLow PriceClose PriceVolume 组成。

我将每个仪器的所有一分钟柱推到一个公用表中,其中主键是StockID

现在,进行一些计算。我将需要从 1 分钟酒吧构建 5 分钟酒吧、10 分钟酒吧、15 分钟酒吧等。示例:我将遍历最后 5 行 1 分钟柱形图,并构建第一个柱形图,柱形尺寸 = 5 分钟。在这 5 分钟内,我需要找到 Open PriceHigh PriceLow PriceClose PriceVolume。同样,我需要 180 个 5 分钟的酒吧。所以,我需要 180 * 5 = 900 行 1 分钟的条形图。 (从 900 开始,我将每 5 分钟构建 180 行)

  1. 如果我从 C# 代码中执行一个简单的 Select 语句以获取所有 900 个一分钟数据,然后在我的 C# 代码中循环并创建 180 个数据和 5 分钟柱,并在每 5 分钟柱中获取开盘价、最高价, 收盘价, 成交量。

  2. 或者,我编写一个 SQL 存储过程来执行上述相同操作,并将所有 180 条 5 分钟柱线数据的开盘价、最高价、最低价、收盘价、交易量返回到 C# 代码。

我的问题是,1) 或 2) 哪个更快,1) 或 2) 哪个更健壮

希望,我已经详细设计了我的问题和场景,供专家指导。

【问题讨论】:

  • 根据我的经验,存储过程要快得多,因为它减少了服务器之间的查询次数
  • 另一个“自己衡量”的问题。至少你在问可维护性。
  • 这取决于许多变量——客户端速度、服务器速度、网络延迟、数据量、索引、s'proc 的质量。你需要自己测试一下。

标签: c# .net sql performance optimization


【解决方案1】:

您正在考虑“循环”。在关系数据库上,您应该考虑“集合”。在存储过程中使用循环通常是使用游标完成的。它很慢(比面向工作集的速度慢 50 - 100 倍),并且与游标相关的锁定机制可能会锁定其他进程。这就是为什么您应该始终避免使用它们的原因。

最快的解决方案是使用存储过程。不能对此进行讨论。最大的区别是它切断了所有网络流量。 SP的直接在数据库上运行,没有网络流量变慢。虽然调试它们可能会很痛苦,但我听说 Visual Studio 2010 提供了一些改进。

接下来您应该考虑的是如何实现存储过程:您可以采用循环和游标的慢速锁定方式,也可以采用面向集合的快速方式。

根据您的描述,通过将一些数据保存在两个表中,您可能会获得很多的性能:一个是包含所有数据的常规表,另一个是仅保存您需要填充那些 5 分钟、10 分钟和 15 分钟,... 条的数据。如果您可以使用三个最后 5 分钟柱的数据创建一个 15 分钟柱,然后将这 3 个最后 5 分钟柱存储在窗口表中,当第 4 个 5 分钟柱到达时,踢出最旧的 5 分钟柱并插入新的 5 分钟酒吧。当您可以根据最后 2 个 15 分钟柱创建新的 30 分钟柱时,然后存储这 2 个 15 分钟柱,....尽量保持这个窗口标签尽可能小,这样它就可以一直留在内存中时间。

【讨论】:

    【解决方案2】:
    • 存储过程解决方案更快。至少因为不需要在 sql server 和 c# app 之间传输所有需要的数据;
    • 但是,我认为存储过程的破坏性较小且难以维护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 2010-09-27
      • 1970-01-01
      • 2012-11-15
      相关资源
      最近更新 更多