Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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
.net 哪一个更快:使用内存还是大量查询?_.net_Sql_Database - Fatal编程技术网

.net 哪一个更快:使用内存还是大量查询?

.net 哪一个更快:使用内存还是大量查询?,.net,sql,database,.net,Sql,Database,您需要从本地SQL server提取大量数据(数千个条目)以用于生成报告。您有两个选择: 1) 使用单个查询从服务器获取数据,将其加载到.NET数据表中,并使用一系列循环获取所需的信息 2) 每次需要记录时执行SQL查询 我知道有几个因素会影响速度,但如果只提供信息,您认为哪一个更快?如果只有几千个条目,线性扫描表可能不会比从服务器获取数据的开销慢。但是,这种方法的伸缩性非常差,如果行数增加,您的解决方案将很快变得非常慢,而使用查询的解决方案更“可预测”。一般来说,让数据库执行它的任务:处理数据

您需要从本地SQL server提取大量数据(数千个条目)以用于生成报告。您有两个选择:

1) 使用单个查询从服务器获取数据,将其加载到.NET数据表中,并使用一系列循环获取所需的信息

2) 每次需要记录时执行SQL查询


我知道有几个因素会影响速度,但如果只提供信息,您认为哪一个更快?

如果只有几千个条目,线性扫描表可能不会比从服务器获取数据的开销慢。但是,这种方法的伸缩性非常差,如果行数增加,您的解决方案将很快变得非常慢,而使用查询的解决方案更“可预测”。一般来说,让数据库执行它的任务:处理数据。

1-批处理请求几乎总是更好的。打开一千个查询将增加网络和连接开销。

如果没有更多信息,我会说选项1。您可以在往返数据库和下载结果集所需的时间内执行大量CPU操作。此外,我假设编写C#逻辑比编写T-SQL逻辑更容易。但是,如果您谈论的是集合查询,那么SQL可能更容易编写。最后,我会做任何更容易写的事情,然后如果写得太慢,就修改它


顺便问一下,我们在这里讨论了多少问题?5, 10, 100? 如果是5个查询,那么时间不会太长,但是如果你对每个记录进行一次查询,并且你可以有很多记录,你永远不会想这样做。

如果RAM中的数据足够少,我希望1会更快,如果您的数据结构上的“一系列循环”的效率不低于SQL server使用其索引可能实现的效率。

我认为这一决定还需要考虑其他因素,例如:

  • 您在SQL上有缓存设置吗
  • SQL是在同一台服务器上还是在远程计算机上?(您是否必须考虑网络开销/速度问题)
  • 内存是一个问题还是服务器上有空闲时间?(web服务器是否有足够的内存来保存数据表中的大量数据?)
  • 有多少人/程序正在访问SQL(更多的人可能等于较慢的响应时间)
  • 它是一个以读或写为主的数据库(写操作往往会锁定表,可能需要等待获取数据,一次大容量读取比几次较小的读取更快)

例如,本地SQL server上的缓存数据可能与将所有内容加载到数据表中的速度一样快。但是,考虑到连接开销/网络延迟/必须从硬盘读取记录,远程计算机上的数据(缓存或未缓存)将慢很多

我正在处理一些类似的问题。。。我的解决方案是规范化每个报表的数据。。。坏消息是,您需要一个后台进程来更新数据,但这样一来,我就不需要处理大量关于内存的信息,而且数据库连接也不需要太多回忆。

“每次需要记录时”?当然,它可以比这更优化?对于这些,您正在使用存储过程,对吗?这不是您唯一的两个选项。在使用结果集时,数据库驱动程序(通常)会进行一些缓冲,一次将一大块行拉入内存。我无法想象为什么我会选择“一次选择一行”作为默认方法。我需要更多信息来提供有效的答案。查询中的每条记录是否需要在报告中使用?如果不是,是否可以构造一个查询来支持这种情况?数千个条目实际上并不是那么多行,但是如果您必须循环该数据X多次,那么它就会变得很麻烦。编写一个基于集合的SQL查询,一次即可提供所需的记录。如果您有4 GB的内存,并且有一个包含1亿条记录的表,那么它可能适合存储在内存中,但是在上面做循环需要很长时间。服务器可能有一个索引,可以直接访问您需要的数据。@tster-这就是我提到索引的原因:例如,如果SQL server对某些数据有一个索引,那么为了在您自己的代码/RAM/集合中模拟它的性能,您可以将数据存储在O(1)字典中,而不是存储在O(n)字典中列表或数组。在内存中对同一数据实现多个索引很困难,而且容易出错。在这种情况下,还可以允许数据库处理它。拥有多个索引很容易(只需在多个字典中拥有相同的数据)。不过,我通常同意首选数据库(虽然不一定要使用它一次选择一条记录):如果不打算使用数据库,那么拥有数据库就没有什么意义了。