Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
Sql server ExecuteReaderAsync导致sql查询需要更长的时间才能完成?_Sql Server_Async Await - Fatal编程技术网

Sql server ExecuteReaderAsync导致sql查询需要更长的时间才能完成?

Sql server ExecuteReaderAsync导致sql查询需要更长的时间才能完成?,sql-server,async-await,Sql Server,Async Await,我有一个SQL server实例,它由多个客户端进程共享。我希望查询完成时占用尽可能少的时间 假设呼叫需要从此共享Sql Server读取1k到10k记录。我的自然选择是使用ExecuteReaderAsync来利用异步的好处,比如重用线程 我开始怀疑异步是否会带来一些开销,因为每次调用ExecuteReaderAsync时,执行可能会停止并恢复。这是真的,若和使用ExecuteReader的实现相比,完成查询的总时间似乎更长。这有意义吗?无论您使用sync还是async调用SQL Server

我有一个SQL server实例,它由多个客户端进程共享。我希望查询完成时占用尽可能少的时间

假设呼叫需要从此共享Sql Server读取1k到10k记录。我的自然选择是使用ExecuteReaderAsync来利用异步的好处,比如重用线程


我开始怀疑异步是否会带来一些开销,因为每次调用ExecuteReaderAsync时,执行可能会停止并恢复。这是真的,若和使用ExecuteReader的实现相比,完成查询的总时间似乎更长。这有意义吗?

无论您使用sync还是async调用SQL Server,对于SQL Server所做的工作以及ADO.NET在序列化和反序列化请求和响应方面所做的CPU限制工作,都没有区别。所以无论你选择什么,差别都很小

使用异步并不是为了节省CPU时间。它是关于节省内存(更少的线程堆栈)和在UI应用程序中拥有一个好的编程模型

事实上,据我所知,异步从未节省CPU时间。这增加了开销。如果您想节省CPU时间,请使用同步方法


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

异步方法和同步方法之间的区别在于,异步调用将导致编译器生成一个状态机,而同步调用只会在数据库不工作的情况下阻塞

IRL,最好的选择方法是对这两种方法进行基准测试。正如usr所说,与执行查询所需的时间相比,这些差异通常是可以忽略的。Async在一些可以节省资源(如分配新线程)的地方会更加出色

关于异步性能,有很多帖子:


  • 看看这篇文章:我不关心客户端的CPU时间。我担心Sql Server在操作过程中花费的时间。经过一些研究,我相信我希望使用ExecuteReadAsync,将任务存储在队列中,然后在关闭DB连接后处理这些任务。否则,处理返回任务所花费的时间将延迟每个ExecuteReadAsync调用。这样,客户机将一个接一个地调用ExecuteReadAsync,没有任何延迟。这有意义吗?对我来说,你想执行多个调用是一件新鲜事。当然,这允许并行化。您不能运行一次返回所有数据的查询吗?这可以节省大量的开销。(当我有这些信息时,我会完全回答你的评论。)每个查询可能返回1k到10k记录。这是一个ExecuteAdAsync。每个记录都有一个需要解析的二进制字段。对此,我会使用任何标准的并行化策略。例如PLINQ或Parallel.ForEach或多个异步方法,每个方法执行一个查询并处理结果。对于这一点,使用异步IO还是同步IO并不重要。您无法通过更改调用方法的方式来加快网络或服务器的速度。并行性越强,使用异步IO的内存优势就发挥得越大。不过,这对花费的总时间没有帮助。为什么会这样?客户端与服务器交互的时间是:(#records*(timeof(ExecuteRead)+timeof(HandlingReadData)))vs(#records*timeof(ExecuteReadAsync))