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

Ank*_*kur 1 .net c# sql optimization performance

我正在使用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分钟)

  1. 如果我从C#代码中执行一个简单的Select语句来获取所有900个一分钟数据,然后在我的C#代码中循环并创建180个数据,每个5分钟条形码,并且在每个5分钟条形图中获得开放价格,高价格,收盘价格,交易量.

  2. 或者,我编写了一个SQL存储过程来执行相同的操作并返回开放价格,高价格,低价格,收盘价,所有180个数据的5分钟到C#代码的数量.

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

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

小智 5

你在考虑"循环".在关系数据库中,您应该考虑"集合".在存储过程中使用循环通常使用游标完成.它很慢(比工作组定向慢50-100倍),与游标关联的锁定机制可能会锁定其他进程.这就是为什么你应该总是避免使用它们.

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

您应该考虑的下一件事是如何实现存储过程:您可以采用循环和游标的慢速锁定方式或快速设置导向方式.

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