【发布时间】:2014-02-19 22:28:25
【问题描述】:
我注意到将 .ToArray() 或 .ToList() 添加到查询时,数据库查询运行得更快。这是因为数据集被加载到内存中并且所有后续查询都是在内存中完成的,而不是进行更昂贵的数据库调用吗?
数据库查询的内存存储限制应该是多少,因为我担心使用过多的内部内存会减慢整个项目的速度,因为我确信占用过多的内存存储会减慢速度急剧下降。
编辑:这适用于 Linq-SQL 查询。我正在使用 SQL Server 2008。
示例 1:在内存中执行大型数据库查询和过滤
我有一个包含 5 000 行的数据库表。我查询整个表(例如 SELECT* From Clients)。我接下来的几个查询基于上一个查询的字段:a)获取所有男性客户; b) 获取所有女性客户 c) 获取 FirstName 以 A 开头的所有客户。
示例 2:执行更频繁的数据库调用
使用同一个5000行的Client表,我需要执行3个查询a)获取所有男性客户; b) 获取所有女性客户 c) 获取 FirstName 以 A 开头的所有客户。我通过数据库调用而不是在内存中进行所有查询。
哪种方法更有效?
【问题讨论】:
-
它几乎只是以非常简单的形式进行缓存。当您可以运行一次并记住结果时,为什么要一遍又一遍地运行一个每次需要 2 分钟的查询呢?不幸的是,这没有硬性和快速的答案。您需要了解每种情况。您不能只将
ToArray应用于所有情况,它并不总是能让事情变得更快。至于有没有限制,谁知道呢?这取决于很多事情。 -
你需要举一个具体的例子。在某些情况下,它会使事情变得非常变慢,例如,在过滤之前拉入整个数据库表。
-
这是用于 Linq-to-Sql 的吗?英孚?无论如何, .ToArray() 和 .ToList() 是在 IEnumerable
上运行的扩展方法,实际上是“枚举”结果。在您真正需要枚举的 IEnumerable 之前,它将推迟执行并尝试生成最有效的表达式以返回枚举结果。通过调用 .ToArray() 或 .ToList() 尽早枚举结果(急切加载)会预先获得成功,但允许您一遍又一遍地重用该查询,而无需枚举结果。 -
同样使用
ToList()或ToArray()将结果保存在内存中并不总是会给我们新的数据。您将创建一些类似捕获的东西,因此您需要不时更新数据以获取新数据。
标签: c# linq performance toarray