c# - C#代码与SQL Server 2008存储过程的性能比较

标签 c# .net sql performance optimization

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

我在主键为StockID的一个公用表中推送了每种乐器的所有一分钟条。

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


如果我从C#代码中执行一个简单的Select语句以获取所有900个1分钟数据,然后循环并在我的C#代码中使用5分钟的条形创建180个数据,则在每5分钟的条形中获取开盘价,高价,收盘价,交易量。
或者,我编写一个SQL存储过程来执行上述操作,并将所有5分钟柱的180个数据的开盘价,高价,低价,收盘价和交易量返回到C#代码。


我的问题是,这将比1)或2)快得多,而1)或2)会更强大

希望我已经详细阐述了我的问题和方案,以供专家指导。

最佳答案

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

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

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

根据您的描述,将某些数据保存在两个表中可能会提高性能:一个包含所有数据的常规表,另一个是仅包含您需要填充这5分钟的数据的“窗口表”, 10分钟和15分钟,...巴。如果您可以使用最近5分钟的三个小柱的数据创建15分钟柱,然后将这3个最后5分钟的柱形存储在窗口表中,当第4个5分钟柱到达时,踢出最早的5分钟条并插入新的5分钟吧。当您可以基于最近的2个15分钟条创建新的30分钟条,然后存储这2个15分钟条时,....尝试使此窗口标签尽可能小,以便它可以保留在所有时间。

关于c# - C#代码与SQL Server 2008存储过程的性能比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9758473/

相关文章:

MySQL:连接三个表,比较两个值

c# - 是否可以将两个 C# 属性合并为一个?

c# - 使用Serilog记录Elasticsearch而无需Microsoft记录

c# - 参数超出范围

c# - System.Windows.Forms 中可用的事件序列和所有 Hook

mysql - ifnull() 作用于多列

c# - 无法将所有文本粘贴到 wpf 文本框中

c# - 带有圆角的 ListView

c# - .NET C# 套接字并发问题

mysql - 是否可以使用核心数据模式创建 SQL 数据库