性能:我应该向数据库发出一个查询还是多个查询?

3
我有一个C#程序,需要处理约100,000个项目,并使用ADO.NET访问sql server数据库。在程序的某个部分,我需要做出性能决策:
在处理期间,对于每个项目,我必须从数据库中读取数据:
是应该为每个项目查询一次数据库,还是在开始时一次性查询所有项目,并将那10列(int和string)约100,000行的数据保存在c#对象中以便在内存中检索所需数据?

2
我会选择存储在内存中,但是这取决于情况 - TheGameiswar
这是一个可以利用文档/NoSql数据库的场景吗? - user8578091
对于10万行数据,一次性将它们全部存储在内存中很容易导致OutOfMemoryException异常。 - Camilo Terevinto
我的个人做法是通过获取大量数据并将其存储在内存中,以便在处理这些记录时减少调用次数。 - Marshall Tigerus
2个回答

5
如果您有一个相对静态的数据集,并且有足够的内存来预先读取所有内容,并将结果缓存而不会使系统的其余部分出现内存饥饿问题,那么答案非常简单:您应该这样做。
任何数据库操作的成本有两个主要组成部分 - 数据传输成本和往返成本。在您的情况下,数据传输成本是固定的,因为总字节数不会根据一次性获取全部还是分批获取而改变。
往返成本包括RDBMS花费的时间来确定从SQL语句中需要哪些数据,定位该数据以及执行所有必要的锁定以确保提供给您的数据是一致的。单次往返不昂贵,但当您执行100,000次时,成本可能会变得禁止。因此,如果您的内存配置允许,最好一次读取所有数据。
另一个问题是您的数据有多动态。如果在处理整个数据集所需的时间内数据更改的可能性很高,则可以采取其他预防措施,以查看是否需要在计算完成后重新处理任何内容。

2
完成这样的操作后,另一个问题是数据是否会改变。如果处理一条记录需要1毫秒,并且您确定数据在100秒内不会更改,则可以在任何风险出现之前轻松处理所有100k条记录。然而,如果处理一条记录需要1秒钟,那么在处理完数据需要27.78小时的情况下,数据发生变化的可能性可能会高得多。 - Marshall Tigerus
@MarshallTigerus 这是一个公正的观察,尽管我认为处理 100,000 个任何东西的时间不太可能超过几分钟。 - Sergey Kalinichenko
如果这些记录在这几分钟内被修改了,那就有影响了。 - Marshall Tigerus
@MarshallTigerus 我认为,当对几分钟内进行的更新做出反应变得至关重要时,重新思考策略是有益的,例如将逻辑移入存储过程或编写触发器。无论如何,我已经多次对相对静态的数据集执行了此操作,以至于我可以将数据缓存到磁盘上,以节省处理的引导成本。 - Sergey Kalinichenko

1
我不确定您所说的处理是什么意思,但通常情况下,如果可以在数据库服务器上进行这种处理,则触发存储过程并传递参数给它将是首选选项。然后您就不需要来回通信等操作。您必须决定是要将数据带到处理过程中(从数据库到应用程序),还是将处理过程带到数据中(将处理代码放入存储过程中)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接