Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪个更快:在内存中过滤数据集还是从SQL Server返回结果集?_C#_Sql Server_Dataset - Fatal编程技术网

C# 哪个更快:在内存中过滤数据集还是从SQL Server返回结果集?

C# 哪个更快:在内存中过滤数据集还是从SQL Server返回结果集?,c#,sql-server,dataset,C#,Sql Server,Dataset,我在一张相当大的桌子上工作,有800k唱片和攀岩,我想过滤一下这张桌子。问题是,表存储在SQL Server中。所以,我想知道,会不会 SELECT * FROM table WHERE condition1=true 查询比将表加载到类型化数据集并使用DataRow更快。查找然后将所有这些数据发送到另一个DataTable 我猜是的,但我还是会问。只要您的SQL server没有因为RAM不足而分页,SQL server应该总是比通过网络加载整个表然后在本地进行过滤更快…您肯定应该在SQL

我在一张相当大的桌子上工作,有800k唱片和攀岩,我想过滤一下这张桌子。问题是,表存储在SQL Server中。所以,我想知道,会不会

SELECT * FROM table WHERE condition1=true
查询比将表加载到类型化数据集并使用DataRow更快。查找然后将所有这些数据发送到另一个DataTable


我猜是的,但我还是会问。

只要您的SQL server没有因为RAM不足而分页,SQL server应该总是比通过网络加载整个表然后在本地进行过滤更快…

您肯定应该在SQL server中这样做,因为:

这是数据库服务器设计的目的之一,也是它擅长的。如果条件总是涉及相同的列,那么您可能需要考虑添加索引以加快查找速度。 性能方面,加载更少的数据总是更快 当你试图将整个事情载入内存时,你的内存消耗将会爆炸式增长。尤其是当表格变得松散时。它现在可能工作正常,但可能会在以后意外地杀死你。
唯一的例外是,如果要反复运行此查询。在这种情况下,在本地缓存数据然后对其进行过滤可能是有意义的。。。但是,即使这样,您也只能在性能测试表明节省了大量资源的情况下这样做。

如果您的筛选器可以作为存储过程编写,那么您可以在选择中使用参数作为值,这肯定会更快,因为您第一次调用存储过程时,它的执行计划是计算和存储的。下一次调用,无需等待计划计算。然而,在您的示例中,计划计算时间可能很短。

我认为没有一个全面的答案,您应该测试它,并根据您的特定情况衡量性能

在执行多个复杂的查询时,使用跨多个表的联接等,我们发现,将一个大型查询执行到数据集中,然后按照内存中的需要对其进行过滤,速度会明显加快。 对我们来说,性能提高的很大一部分是因为它避免了我们对数据库进行多次调用,这可能会造成瓶颈

有一些SQL函数,例如,如果您必须执行类似于1、2、3、4、5、6中的WHERE LocationId的操作,那么与在C中执行dataset.LocationId.Whereid=>myValues.Containsid相比,它在SQL中的性能要差得多,所以在这种情况下,如果您测量它,您应该会发现在内存中的性能最好


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

我知道这个问题很老了,但答案都缺少一个要点。数据库可以使用筛选条件以及表索引从磁盘加载较少的数据。例如,如果要执行SELECT*FROM X,其中ID=7,则假设ID是主键,则数据库将仅从磁盘加载一行。如果在服务器端筛选数据,则数据库需要从磁盘上加载整个表


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

但这种可能性有多大?遇到过吗?在你和攀岩的情况下听起来并不常见。但一个很好的例子是一个相对较小的例子,这是我不久前遇到的一个例子——假设您正在为1000名员工进行税务计算。每位员工有10项税费,由员工+雇主计算。税务表由500000行组成。美国有15000多个税务管辖区。对于10000个税务计算中的每一个,每次都可以从数据库中进行选择。但是,我们缓存了整个税务表集。这需要几秒钟,但我们每天只刷新缓存一次。最终结果是每位员工节省了10+db的点击量,使税务计算成为实时的,而不是成批的。如果表很小的话!静态通常不会改变值,那么将其加载到内存中是有意义的。。。但您描述的情况是:不要将表加载到内存中。