【问题标题】:Is there a good way to mix fast changing in-memory data with large SQL database data?有没有一种将快速变化的内存数据与大型 SQL 数据库数据混合的好方法?
【发布时间】:2012-05-28 19:06:36
【问题描述】:

我正在使用一种架构,该架构需要将大型(静态)表与非常频繁变化的数据相结合。

为了强调这一点,想象一下 SO 网站用户访问内部连接到他们的用户数据库)。

SELECT * FROM UserProfile INNER JOIN OnlineUser (on UserProfiles.id = OnlineUser.id)

UserProfile 驻留在大型 SQL 表中,而 OnlineUser 是 Web 服务器上的动态数据。

将所有内容都放入内存会占用大量空间,并且将所有内容都放入数据库中确实会给服务器带来负担(想想就不寒而栗)。有更好的方法吗?

上帝 Jon Skeet says LINQ 无法处理内存中集合和数据库表之间的连接。他建议使用包含子句或列表,在这种情况下两者都不合适。

编辑:

SQL Server 中的内存表 (PINTABLE) 可以做到这一点。由于该功能已被弃用,是否可以假设 SQL Server 2008 会设法将其保存在内存中以减少 IO?

【问题讨论】:

  • 为什么“包含子句 [..] 是合适的”?

标签: sql .net linq


【解决方案1】:

您必须在某处进行实际的连接操作。要么将 OnlineUser 数据带到 SQL Server 并在那里执行连接,要么将 UserProfile 数据带入内存并在那里执行连接。

通常最好让数据库服务器整理出需要的数据,然后只将其读入内存。解决该问题的一种方法是在 SQL Server 上创建一个临时表,在其中放置连接操作所需的数据字段(在您的示例中为 OnlineUser.id)。

然后执行 SQL 查询,将所需的数据存入内存。确保您拥有加快过滤速度的索引。检索到内存后,匹配两个集合(例如,将它们按相同的键排序,然后使用 linq Zip 运算符)

【讨论】:

  • 我同意加入需要发生在某个地方。由于此查询将频繁运行,因此构建临时表将非常昂贵。我会更新问题,提供更多信息。
猜你喜欢
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2021-12-13
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多