我正在使用C#,.NET 3.5框架和SQL Server 2008 R2开发高频交易应用程序。我正在订阅70种乐器,对于我存储1分钟小节的每种乐器。每个工具的每个条形由Open Price
,High Price
,Low Price
,Close Price
,Volume
组成。
我在一个公共表格中推送每个乐器的所有一分钟小节,其中主键为StockID
。
现在,进行一些计算。我需要从1分钟的棒材构建5分钟棒材,10分钟棒材,15分钟棒材等。示例:我将循环最后5行1分钟的条形并构建第一条,条形大小= 5分钟。在5分钟的栏内,我需要找到Open Price
,High Price
,Low Price
,Close Price
,Volume
。同样,我需要180,5分钟的棒。所以,我需要180 * 5 = 900行1分钟的条形码。 (从900开始,我将构建180行,每行5分钟)
如果我从C#代码中执行一个简单的Select语句来获取所有900个一分钟数据,然后循环并在我的C#代码中创建180个数据,每个5分钟条形码,并且在每个5分钟条形图中获得开放价格,高价格,收盘价,成交量。
或者,我编写了一个SQL存储过程来执行上述操作并返回开放价格,高价格,低价格,收盘价,所有180个数据的5分钟到C#代码的数量。
我的问题是,哪个会更快1)或2)哪个会更强大1)或2)
希望,我已经详细阐述了我的问题和方案,供专家指导我。
答案 0 :(得分:5)
你正在考虑"循环"。在关系数据库中,您应该考虑" sets"。在存储过程中使用循环通常使用游标完成。它很慢(比工作组定向慢50-100倍),与游标关联的锁定机制可能会锁定其他进程。这就是为什么你应该总是避免使用它们。
最快的解决方案是使用存储过程。没有关于此的讨论。最大的不同是它削减了所有网络流量。 SP直接在数据库上运行,没有网络流量减慢。调试它们可能会很麻烦,但我听说Visual Studio 2010对此提供了一些改进。
您应该考虑的下一件事是如何实现存储过程:您可以采用循环和游标的慢速锁定方式或快速设置导向方式。
根据您的描述,您可以通过将一些数据保存在两个表中来获得很多:一个是包含所有数据的常规表,另一个是" window-table&#34 ;只保存您需要填充5分钟,10分钟和15分钟,......栏的数据。如果您可以使用最后3个5分钟栏的数据创建一个15分钟的栏,那么将那3个最后5分钟的栏保存在窗台中,当第4个5分钟栏到达时,踢出最旧的5分钟栏并插入新的5分钟吧。当您可以根据最后2个15分钟栏创建新的30分钟栏时,然后存储那些2个15分钟的栏,....尽量保持这个窗口表尽可能小,这样它就可以留在内存中所有的时间。
答案 1 :(得分:3)