对于我的工作,我经常需要大的选择,加载大量的数据。这种连接发生在JDBC驱动程序和高的获取大小上。当直接在数据库的服务器上工作时,这不是一个问题。但是,当从另一台机器连接时,加载时间变得非常糟糕,加载数据所需的时间超过10倍。
请注意,数据量实际上很小(10S MB,200 k行),网络带宽不能成为限制因素。因此,几乎可以肯定是延迟和往返导致了糟糕的性能。
通过与wireshark的检查,延迟问题似乎得到了证实,我在客户机和服务器之间看到了一个巨大的来回。(请注意两个窗口)。类似于在这个老话题这里中观察到的情况。
是否有任何服务器或客户端(JDBC)设置可以减少往返并降低延迟成本?
编辑:
在同一台机器上:远程: 20分钟加载数据(ping ~120 1ms)本地:50秒(ping <1ms)
本地的意思是内联网和db服务器在300英尺外的一栋大楼里。在实际服务器上也是50秒。解释分析说105毫秒。
我确实理解这个问题,我只是不知道影响有那么大。我还想知道这是否是一个窗口问题,因为当从远程连接时,在很少数据的情况下,似乎有太多的ack。我应该在网络论坛上问这个问题。
发布于 2020-02-21 16:23:41
在PostgreSQL方面没有什么可以处理这个问题。
JDBC端,我只知道快速的google搜索指向no。
我在处理大型数据集时使用的一个解决方案是,每次只获取几条记录,从1000到10000。
Select * from tablename where tablename.id > 1 ordered by id limit 1000下一组查询
Select * from tablename where tablename.id > 1000 ordered by id limit 1000有些人将此称为异步抓取/分页。
某些后台大多数db连接默认以同步模式运行,即“命令发送”客户端等待直到所有数据被传递。这使得应用程序似乎挂了很长一段时间,这让用户认为应用程序已经崩溃或者其他什么地方出错了。
使用异步技术,数据可以使用后台进程/线程连续获取和传递,而代码的其余部分则可以继续工作,给用户提供外观,应用程序非常快速。
它很难一次只取几条记录来编写代码,但在大数据集上是值得的,因为应用程序不需要等待所有的数据。
有几种工具可以使这更容易,例如在服务器上创建游标和只从服务器获取X记录。但是也有回溯到游标,消耗服务器资源,运行清理代码所需的资源。
一些客户端库通过直接支持游标使这很容易,而另一些客户端库不支持此特性,JDBC似乎不支持这一点,因此必须编写它。
https://dba.stackexchange.com/questions/260259
复制相似问题