数据库与Web应用同服部署时,使用async/await执行SQL查询是否有收益?
核心结论
async/await带来的收益和数据库是否与Web应用部署在同一台服务器无关,只要你使用的数据库驱动实现了标准的异步API,就能获得收益,不需要额外调整数据库部署方式。
异步代码的收益来源
ASP.NET Core 中异步IO的核心作用是减少IO等待期间的线程池线程浪费:
- 当你调用
await执行数据库查询时,.NET运行时会将当前线程释放回线程池,供其他请求使用,直到数据库返回查询结果后,再重新分配线程继续执行后续逻辑 - 不管这个查询请求是发往远程服务器的网络IO,还是发往本地数据库的进程间通信IO、本地磁盘IO,只要存在IO等待时间,异步就能提升服务的并发处理能力,降低高负载下的线程池耗尽风险
关于RDBMS的异步执行疑问
你不需要数据库本身“异步执行查询”就能获得C#侧异步代码的收益:
- 主流RDBMS的官方驱动(SQL Server的
Microsoft.Data.SqlClient、PostgreSQL的Npgsql等)都完整实现了异步IO接口,底层依赖操作系统的IOCP/epoll机制实现非阻塞IO,和数据库本身的查询执行逻辑无关 - 数据库侧是同步还是异步处理你的查询请求,只影响查询本身的执行耗时,对你的Web应用侧的线程复用逻辑没有任何影响
关于数据库部署位置的误区
完全不需要将数据库部署在独立服务器才能获得异步收益:
- 哪怕数据库和Web应用部署在同一台服务器,数据库查询依然是IO密集型操作,存在固定的等待开销,异步依然能有效提升线程利用率
- 只有当你的查询耗时极低(微秒级)、服务QPS极低的极端场景下,异步的微小调度开销才会超过收益,绝大多数业务场景下异步的收益都远高于开销
内容的提问来源于stack exchange,提问作者rafalxyz
相关产品推荐
相关产品推荐

