我正在使用一种架构,该架构需要混合使用非常频繁变化的数据连接的大型(静态)表。
为了强调这一点,想象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?
答案 0 :(得分:0)
你必须在某处进行实际的连接操作。您可以将OnlineUser
数据带到SQL Server并在那里执行连接,或者将UserProfile
数据带入内存并在那里执行连接。
通常最好让数据库服务器整理所需的数据,并将其读入内存。解决此问题的一种方法是在SQL Server上创建一个临时表,您可以在其中放置连接操作所需的数据字段(在您的示例中为OnlineUser.id
)。
然后执行SQL查询以将所需数据存入内存。确保您拥有可加快过滤速度的索引。检索到内存后,匹配两个集合(例如,将它们按相同的键排序,然后使用linq Zip
运算符)