ExecuteReaderAsync导致SQL查询时间更长?

4
我有一个SQL Server实例,被多个客户端进程共享。我希望查询的时间尽可能短。
比如需要从共享的SQL Server读取1k到10k条记录,我的自然选择是使用ExecuteReaderAsync来利用异步的优点,例如重用线程。
我开始想知道是否异步操作会有一些开销,因为每次调用ExecuteReaderAsync都可能会停止和恢复执行。如果这是真的,那么相对于使用ExecuteReader的实现,查询完成所需的总时间会更长。这有道理吗?

请看这篇文章:https://dev59.com/H2Ag5IYBdhLWcg3wM4lb - Yuval Itzchakov
2个回答

7

无论您是使用同步还是异步调用SQL Server,对于SQL Server执行的工作和ADO.NET序列化和反序列化请求和响应所做的CPU绑定工作来说,没有区别。因此,不管您选择什么,差异都很小。

使用异步与节省CPU时间无关,它是关于节省内存(较少的线程堆栈)并在UI应用程序中具有良好的编程模型。

实际上,据我所知,异步永远不能节省CPU时间。它会增加开销。如果您想节省CPU时间,请使用同步方法。

在服务器上,在低并发负载下使用异步不会增加任何价值。它会增加开发时间和CPU成本。


我不关心客户端的 CPU 时间,我关心 Sql Server 在操作期间花费的时间。经过一些研究,我相信我想使用 ExecuteReadAsync,将任务存储在队列中,并在关闭 DB 连接后处理这些任务。否则,处理返回的任务所花费的时间会延迟每个 ExecuteReadAsync 的调用。这样,客户端将连续调用 ExecuteReadAsync 而没有任何延迟。这有意义吗? - Igor Gatis
每个查询可能返回1K到10K条记录。那就是每个查询都需要执行ExecuteReadAsync。每条记录都有一个需要被解析的二进制字段。 - Igor Gatis
对于这个问题,我会使用任何标准的并行化策略,比如PLINQ、Parallel.ForEach或者多个异步方法来执行查询并处理结果。无论您是使用异步IO还是同步IO,都不会对此有太大影响。改变调用方法的方式并不能让网络或服务器更快。并行度越高,使用异步IO的内存利益就越大,但总花费时间却不会有所帮助。为什么呢? - usr
客户端与服务器交互所花费的时间为: (#records * (timeof(ExecuteRead) + timeof(HandlingReadData))) 相对于 (#records * timeof(ExecuteReadAsync)) - Igor Gatis
你是正确的,你可能应该在任何给定时间内拥有一定数量的最佳数据库操作。无论您是同步还是异步执行都没有关系。你认为这很重要吗? - usr
显示剩余2条评论

2
异步(async)方法和同步(sync)方法的区别在于异步调用会导致编译器生成状态机,而同步调用只会在对数据库进行操作时阻塞。在现实生活中,选择最佳方法的最好方式是对两种方法进行基准测试。通常来说,这些差异可以忽略不计,与查询执行所需的时间相比微不足道。异步在可能节省资源(如分配新线程)的情况下表现更出色。有许多关于异步性能的文章:
  1. 异步等待性能
  2. 异步的禅意:最佳性能的最佳实践
  3. 异步性能:了解异步和等待的成本

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