从同一数据库中的不同表进行并行读取值得吗
本文关键字:并行 读取 值得 数据库 | 更新日期: 2023-09-27 18:00:34
在我正在开发的应用程序中,它需要从同一SQL Server数据库中的大约5到10个表中读取数据,并将它们加载到多个List<>然后对数据进行处理。从每个表返回的行数各不相同,有些表为1行,有些表约为1000行。
该应用程序是用C#4.0编写的,所以我考虑使用任务并行库并启动多个任务来同时从这些表中检索数据。我认为这会比调用一个按序列返回这些表中数据的查询更快,但我不确定。所以我的问题是:
- 考虑到打开数据库的多个连接等开销,使用多个任务检索数据真的会更快吗
- 如果在某些情况下答案是"是",那么在哪些情况下答案为"否"
- 如果答案是否定的,是否有其他方法
- 在使用多个任务检索数据时,还需要考虑其他事项吗
为了缩小范围,以下是您可以做出的一些假设:
- 数据处理不是问题的一部分。仅仅是数据检索
- 其中一些表格与FK有关。像父级<--子<--孙子
- 这些表只包含varchar和数字列,行大小小于400字节
- 普通ADO.NET(例如SqlConnection/SqlCommand/SqlDataReader)用于从每个表中检索数据
- 每个任务都将调用一个自包含的方法,该方法从SqlDataReader读取数据并返回对象列表
- 数据库服务器功能强大,足以处理所有并发连接和查询
- 如果使用单个查询检索序列中的所有数据,则客户端计算机的功能足以处理数据操作。它能够进行多线程处理
- 如果使用单个查询,网络传输数据的速度足够快
提前感谢您的时间和投入!
首先说,我认为这不是您在这个场景中需要关注的。数据量在这里似乎不是问题,所以我会把重点放在其他地方。
回答你的一些问题。是的,并行加载可以提高性能,但通常情况下数据(行数)要大得多。不过,您确实需要注意内存足迹,因为您不想用内存中的所有数据杀死服务器。
如果你频繁地多次跑步,我会说,那么你需要专注于此。
一如既往,在问题出现之前不要进行优化
编写可理解和可维护的代码更为重要。几个月后,当你需要修改这个代码时,你会感谢你的明星。
还有,你试过什么
你做过基准测试吗?编写一个小应用程序,将这两种情况循环多次(数百甚至数千次),并测量所需时间。用秒表看看时差是多少。
10个最大1000行的表听起来像是一个小数据量。与其打开多个连接并执行并行处理,我宁愿只有一个存储过程返回所有不同的表,并使用dataReader.NextResult()逐个读取它
请参阅以下StackOverflow问题的公认答案DataReader 中的倍数表
我要说"这取决于"场景。让我解释一下,如果一个任务不依赖于另一个并行任务的查询或处理结果,那么几个并行检索任务的生成和后续处理将"更快"。如果你走这条路,可以看看稍微过时但仍然相关的"C#中的并发与协调"和C#异步,等待功能。
我的一些想法是,你引入了复杂性,当需要时可以探索/调查,并只设计目前需要的东西。
在走并行路线之前,请探索使用jQuery/ajax对"网页"(我假设是一个网络应用程序)的不同部分进行延迟加载的可能性,以提高网页的感知响应能力。
无论你选择哪种方法,使用YSlow或类似工具对网页进行评测都是相关的。
对不起你的咆哮!