我有一个C#程序,必须处理大约10万个项目,并且ADO.NET访问sql server数据库,并且在程序的一部分我必须做出性能决定:
Durring处理,对于每个项目,我必须从数据库中读取数据:
我应该为每个项目查询一次数据库,还是应该在开头查询所有项目一次,并在内存中的c#对象中保留100 000行数据(大约10列 - int和string)并检索所需数据从它?
答案 0 :(得分:5)
如果你有一个合理的静态数据集,并且有足够的内存来预先读取所有内容,并保持结果缓存而不会使系统的其他部分缺乏内存,那么答案很简单:你应该这样做。
任何数据库操作的成本都有两个主要组成部分 - 数据传输的成本和往返的成本。在您的情况下,数据传输的成本是固定的,因为总的字节数不会根据您是一次检索它们还是一次获取它们而改变。
往返的成本包括RDBMS从SQL语句中找出所需数据所需的时间,定位该数据,并执行所需的所有锁定以确保其为您提供的数据是一致的。单次往返并不昂贵,但当你做了10万次时,成本可能会变得过高。这就是为什么如果您的内存配置允许,最好立即读取数据。
另一个问题是您的数据有多动态。如果您在处理整个集合所花费的时间内数据发生变化的可能性很高,那么您可以采取其他预防措施,以确定在计算完成后是否需要重新处理任何内容。
答案 1 :(得分:1)
我不确定处理的意思,但通常如果可以在数据库服务器上完成此处理,则触发存储过程并将参数传递给它将是首选选项。然后,您不需要往返等。您必须决定是否要将数据带到处理(从db到应用程序)或将处理带到数据< / em>(处理代码到存储过程)。