当从 .NET 中访问 PostgreSQL 时,是否存在阻止 Npgsql 提供多个同时读取器的内在限制?
Is there an intrinsic limitation that prevents Npgsql from providing multiple simultaneous readers when accessing PostgreSQL from within .NET?
有许多 Internet 资源(Whosebug 或其他)表明 Npgsql 不支持 SQLServer 所支持的 MARS(多个活动阅读器)。这是一个内在的 PostgreSQL 限制吗?或者它更多地与 Npgsql 的设计有关?
换句话说,是否可以通过将此功能贡献给 Npgsql 来解决这个问题,还是这种努力注定要失败?
(我知道 PostgreSQL 社区根据 "why would one even need such a thing, PostgreSQL allows for a better formulation of the SQL statements to alleviate the need altogether" 提出了一个令人信服的案例。我们只是说这是关于照顾具有数万个现有 SQL 语句的系统,并重写它们一个一个显然不是一个选项)
真正的问题是幕后发生了什么来支持 MARS 这样的功能。
在线路层面,Npgsql 和 PostgreSQL 之间的通信非常简单:有一个 TCP 套接字,Npgsql 向 PG 发送查询,PG 响应该查询的整个结果集 - 单次往返。
MARS 的各种模型使 Npgsql 每次获取 X 行,而不是获取整个结果; Npgsql 会在内存中缓冲 X 行,并在用户使用完这些行后进行新的往返。这将允许 MARS,但代价是为每个单个查询引入大量新的网络往返:您现在有 N 次往返,而不是一次往返,其中 N 是行数除以 X。这里的性能影响相当大.行缓冲也有内存开销。
另一种可能性是让 Npgsql 读取整个结果集并将其缓冲在内存中,因此每个查询都会立即被消耗,从而允许执行其他查询。这里的缺点显然是缓冲整个结果集的潜在巨大内存开销。
所以MARS肯定是有可能的,问题是它是如何实现的,你为它付出了什么代价。我时不时地收到开发人员从 SQL 服务器移植代码的请求,但老实说,人们并没有经常要求它。
PS 请注意,最后一个选项 可能 与我们正在为下一个主要版本探索的一些性能更改更相关。但还不确定。
有许多 Internet 资源(Whosebug 或其他)表明 Npgsql 不支持 SQLServer 所支持的 MARS(多个活动阅读器)。这是一个内在的 PostgreSQL 限制吗?或者它更多地与 Npgsql 的设计有关?
换句话说,是否可以通过将此功能贡献给 Npgsql 来解决这个问题,还是这种努力注定要失败?
(我知道 PostgreSQL 社区根据 "why would one even need such a thing, PostgreSQL allows for a better formulation of the SQL statements to alleviate the need altogether" 提出了一个令人信服的案例。我们只是说这是关于照顾具有数万个现有 SQL 语句的系统,并重写它们一个一个显然不是一个选项)
真正的问题是幕后发生了什么来支持 MARS 这样的功能。
在线路层面,Npgsql 和 PostgreSQL 之间的通信非常简单:有一个 TCP 套接字,Npgsql 向 PG 发送查询,PG 响应该查询的整个结果集 - 单次往返。
MARS 的各种模型使 Npgsql 每次获取 X 行,而不是获取整个结果; Npgsql 会在内存中缓冲 X 行,并在用户使用完这些行后进行新的往返。这将允许 MARS,但代价是为每个单个查询引入大量新的网络往返:您现在有 N 次往返,而不是一次往返,其中 N 是行数除以 X。这里的性能影响相当大.行缓冲也有内存开销。
另一种可能性是让 Npgsql 读取整个结果集并将其缓冲在内存中,因此每个查询都会立即被消耗,从而允许执行其他查询。这里的缺点显然是缓冲整个结果集的潜在巨大内存开销。
所以MARS肯定是有可能的,问题是它是如何实现的,你为它付出了什么代价。我时不时地收到开发人员从 SQL 服务器移植代码的请求,但老实说,人们并没有经常要求它。
PS 请注意,最后一个选项 可能 与我们正在为下一个主要版本探索的一些性能更改更相关。但还不确定。