哪个更快:在内存中过滤DataSet或从SQL Server返回结果集?

时间:2011-07-20 00:00:16

标签: c# sql-server dataset

我正在制作一张相当大的桌子(800k记录和攀爬),我想过滤掉这张桌子。问题是,表存储在SQL Server中。所以,我想知道,是不是

SELECT * FROM table WHERE condition1=true

查询比将表加载到类型化DataSet并使用DataRow.Find()然后将所有这些发送到另一个DataTable更快?

我猜是的,但无论如何我都会问。

6 个答案:

答案 0 :(得分:5)

只要您的SQL服务器因RAM不足而没有分页,SQL Server应该总是比通过网络加载整个表然后在本地过滤更快...

答案 1 :(得分:3)

你绝对应该在SQL Server中这样做,因为:

  1. 这是数据库服务器的目标之一,也是擅长的。如果条件总是涉及相同的列,那么您可能需要考虑添加索引以进一步加快查找速度。
  2. 性能方面,加载较少的数据总是更快
  3. 当您尝试将整个内容加载到内存中时,您的内存消耗将会爆炸。特别是当桌子不受约束时。它现在可能正常,但可以在以后意外杀死你。

答案 2 :(得分:2)

唯一的例外是如果您要反复运行此查询。在这种情况下,可能有意义地在本地缓存数据然后对其进行过滤......但即便如此,只有在性能测试表明节省了大量资金时才应该这样做。

答案 3 :(得分:1)

我认为没有真正的答案,你应该测试它并根据你的具体情况衡量性能。

当进行多个复杂查询时,在多个表之间进行连接等,我们发现将一个大型查询执行到数据集中然后在内存中过滤它需要的速度要快得多。 我们性能提升的很大一部分原因是它避免了我们对数据库进行多次调用,这可能会导致瓶颈。

有一些SQL函数,例如如果你必须做WHERE LocationId IN (1, 2, 3, 4, 5, 6)之类的事情,那么在SQL中执行dataset.LocationIds.Where(id => myValues.Contains(id))与在C#,against large datasets中执行相比更糟糕,所以在这种情况下,如果你测量它,你应该找到-memory表现最佳。

具有简单SELECT条件的WHERE在SQL中几乎肯定会更快。这就是为什么你应该评估每个场景,并在需要时进行测试和测量。

答案 4 :(得分:0)

如果您的过滤器可以写为存储过程(您可以在select中使用参数),它肯定会更快,因为第一次调用存储过程时,会计算并存储其执行计划。下一个电话,不等待计划的计划。 (在你的例子中,计划计算时间可能很小)。

答案 5 :(得分:0)

我知道这个问题已经过时了,但答案都缺少重要的一点。数据库可以使用筛选条件以及表索引来从磁盘加载较少的数据。例如,如果您要执行SELECT * FROM X WHERE ID = 7,那么(假设ID是主键)数据库将只从磁盘加载一行。如果您在服务器端过滤了该数据,那么数据库将需要从磁盘加载整个表。

假设您受I / O限制,这将为您带来更好的性能。当然,并非所有过滤条件都能以这种方式工作。这取决于数据库服务器,索引等。