SQL Server Compact与C#数据结构相比

时间:2011-07-18 11:57:00

标签: c# sql sql-server linq performance

我们目前使用List<T>来存储我们正在运行的模拟项目中的事件。我们需要优化内存利用率和处理事件所需的时间,以便获得某些关键指标。

我们考虑将事件日志移动到SQL Server Compact数据库表,然后可能使用Linq来计算指标。根据您的经验,您认为使用SQL Server Compact比使用C#的内置数据结构更快还是我们会遇到问题?

5 个答案:

答案 0 :(得分:3)

一些想法。

MSMQ Microsoft Message Queue

您可以让线程从MSMQ出发并动态更新指标。如果您需要将这些事件存储在以后的paroosal中,您可以在将它们出列时将它们放入数据库中。 MSMQ在这些场景中表现出更好的可扩展性 - 特别是当发布者和订阅者具有不对称的处理速度时;正在使用二进制数据(因为SQL可能会因为为VARBINARY分配空间而陷入困境,或者为索引分配/拆分页面。)

另外两个SQL场景是这个场景的补充 - 你仍然可以使用dequeueing插入到SQL中;在SQL分配空间时避免模拟中的任何打嗝。

你可以在一定程度上支持@Aliostad所说的使用这个。

OLAP 在线分析处理

听起来您可能会从OLAP(立方体等)中受益。这将增加模拟的整体运行时间,但会提高数据的价值。不幸的是,这意味着为一个更大的SQL版本分配现金。

存储过程

虽然Linq-to-SQL非常适合“普通开发者”,但请远离科学项目。除了能够检查查询计划之外,还可以在原始TSQL中使用许多很棒的技巧。如果您希望获得最佳性能,请仔细规划您的数据库并创建存储过程/ UDF以汇总数据。

如果你只能计算C#中的一些指标,那么事先在SQL中做多少工作 - 然后随意使用Linq-to-SQL来获取数据。

另外请记住,如果您要插入MSMQ的末尾,您可以积极地编制索引,这将加快您的指标计算速度,而不会影响您的模拟。

如果确实需要更好的内存利用率(即你实际上已经用完了),我只会涉及SQL。

内存映射文件

这允许您将内存压力抵消到磁盘上;如果需要“重新加入”,则会对性能造成损失。

<强>总体

我可以避开Linq来定义基本指标 - 在SQL中执行。在这种情况下,MSMQ毫无疑问是一个巨大的赢家。如果你的内存不足,请不要过度复杂化内存问题并将其保留在.Net中。

答案 1 :(得分:1)

如果您需要处理所有事件,C#List<>将比Sql Server更快。 Array<>将具有更好的性能,特别是如果元素是结构而不是类,因为结构放在数组中,其中仅从数组引用类实例。在数组中使用结构可以减少垃圾收集并增加缓存局部性。

如果您只需要处理部分事件,我认为解决方案在加速时会按此顺序排列:

  1. C#数据结构,专为满足您的需求而设计。
  2. Sql Server
  3. 天真的C#数据结构,遍历搜索正确元素的列表。

答案 2 :(得分:0)

听起来你认为你需要将它们放在数据库中才能使用Linq。事实并非如此。您可以将Linq与csharp的内置结构一起使用。

答案 3 :(得分:0)

取决于您所说的“更快使用”。如果这是关于数据访问的性能,那就是你有多少数据,对于大数据而言,数据库解决方案只是出于统计目的,绝对是良好的选择。

与DB一样,出于这种目的,我建议 SQLite :因为这是单个文件(没有服务需要像 SQL Server compact )完全支持ACID的DB。但同样,这取决于您的数据大小,因为 SQLite 的数据劣等限制为 SQLServer

问候。

答案 4 :(得分:0)

  

我们需要优化内存利用率

使用Sql-Server-CE

  

处理事件所需的时间

使用Linq-To-Objects。


这两个目标冲突,您需要选择一个对您更重要的目标。