首页 > 数据库 >PgSQL外连接分页时出现重复数据

PgSQL外连接分页时出现重复数据

时间:2022-10-18 15:36:46浏览次数:60  
标签:Join 分页 OFFSET PgSQL 版本 offset 20 连接

今天工作中遇到的问题。

SELECT * FROM a LEFT JOIN b
	ON a.c = b.d
	LIMIT 20 OFFSET 0;

SELECT * FROM a LEFT JOIN b
	ON a.c = b.d
	LIMIT 20 OFFSET 20;

上面两条是一摸一样的语句,只有OFFSET参数不同,相当于第一条语句显示出第一页的数据,第二条显示出第二页,页大小为20,不同的两页理应不应该有重复数据,但确实出现了。

但当我把公司的两张表弄到我的pgsql上,问题就没了

公司PGSQL版本:12.2
我的PGSQL版本:14.5

最开始怀疑的方向错了,看到版本不同表现不同,就怀疑是优化器的锅了。

img

果然,offset为0和offset为20时所使用的执行计划不同,offset为0时被转成了Right Join,而高版本就没这个问题。

按理来说,Right Join和Left Join也不应该造成结果有差异,因为都是双层循环,主表(在这个例子中是a)在外层循环中。但关键是这个用的又是什么Hash Join。我之前没了解过(好像数据库系统里学过),不过应该是Hash Join使得左右连接产生了不同的结果。

解决办法

  1. 添加Order by确定排序顺序
  2. 关闭hashjoin
  3. 不知道PgSQL有没有索引提示这种东西,如果有的话可以影响执行计划的选择

标签:Join,分页,OFFSET,PgSQL,版本,offset,20,连接
From: https://www.cnblogs.com/lilpig/p/16802677.html

相关文章

  • Docker 容器连接
    学习docker最好还是整个服务器,买太贵了,建议租一个,我用的是3A服务器!!!前面我们实现了通过网络端口来访问运行在docker容器内的服务。容器中可以运行一些网络应用,要让......
  • Docker 容器连接
    学习docker最好还是整个服务器,买太贵了,建议租一个,我用的是3A服务器!!!前面我们实现了通过网络端口来访问运行在docker容器内的服务。容器中可以运行一些网络应用,要让外部......
  • SSH-agent如何通过代理进行服务器连接
    openssh是什么这里不做解释,但凡是用过linux系统的一般都是会了解这个的,毕竟openssh都是系统自带的应用。openssh一般都是指linux上的客户端,很多linux系统自有客户端的ssh......
  • 数据库连接池概述和实现介绍
    1.概念:其实就是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问......
  • 通过配置SSH免密连接来实现集群的群启
    SSH免密登录1.配置SSH基本语法:#ssh另一台主机的IP或主机名(需要预先配置/etc/hosts)ssh连接出现"Hostkeyverificationfailed",输入”yes“即可。如果root用户不能......
  • nginx下websocket的长连接问题
    1.浏览器报错2.解决问题(1)在nginxhttp中添加http{map$http_upgrade$connection_upgrade{defaultupgrade;''close;}}......
  • 数据库连接池-c3p0-基本使用、配置演示
    数据库连接池-c3p0-基本使用步骤:导入jar包(3个)c3p0-0.9.5.2.jar  mchange-commons-java-0.2.11.jar  mysql-connector-java-5.1.47.jar定义配置文件:......
  • springboot连接mysql报错errorCode 0, state 08S01
    前言许久未维护的项目需要检查一些数据,重新运行项目发现有createconnectionSQLException,具体报错信息是errorCode0,state08S01。SpringBoot版本2.5,MySQL8.0报......
  • day49-JDBC和连接池05
    JDBC和连接池0511.BasicDAO先来分析一个问题前面我们使用了Apache-DBUtils和Druid简化了JDBC开发,但仍存在以下不足:SQL语句是固定的,不能通过参数传入,通用性不好,需要......
  • JDBC连接数据库
    目录 ​​1、写在前面✏️​​​​2、遇到问题​​​​3、解决问题​​​​4、总结......