【问题标题】:SQL Server Compact compared to C# data structuresSQL Server Compact 与 C# 数据结构的比较
【发布时间】:2011-10-07 15:11:41
【问题描述】:

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

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

【问题讨论】:

    标签: c# sql sql-server linq performance


    【解决方案1】:

    一些想法。

    MSMQ微软消息队列

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

    另外两个 SQL 场景是对这个场景的补充——你仍然可以使用出队插入到 SQL 中;以避免在 SQL 分配空间时模拟中出现任何问题。

    您可以在一定程度上避开@Aliostad 所说的话。

    OLAP在线分析处理

    听起来您可能会从 OLAP(多维数据集等)中受益。这将增加模拟的整体运行时间,但会提高数据的价值。不幸的是,这意味着要花钱购买更大的 SQL 版本之一。

    存储过程

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

    如果您只能在 C# 中计算某些指标,请事先在 SQL 中做同样多的工作 - 然后随意使用 Linq-to-SQL 来获取数据。

    还请记住,如果您在 MSMQ 的末尾插入,您可以积极索引,这将加快您的指标计算,而不会影响您的模拟。

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

    内存映射文件

    这允许您抵消磁盘上的内存压力;如果需要重新“分页”,则会降低性能。

    总体

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

    【讨论】:

    • 谢谢,我真的很喜欢你的想法,尤其是 MSMQ。
    【解决方案2】:

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

    如果你只需要处理部分事件,我认为解决方案在速度方面是这样的:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        取决于您的意思是“更快的使用”。如果这与访问数据的性能有关,那就是您拥有多少数据,对于大数据,仅用于统计目的的 DB 解决方案绝对是好的选择。

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

        问候。

        【讨论】:

          【解决方案5】:

          我们需要优化内存利用率

          使用 Sql-Server-CE

          处理事件所需的时间

          使用 Linq-To-Objects。


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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-09
            • 2013-06-28
            • 1970-01-01
            • 2014-03-25
            • 2021-04-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多