暂无图片
postgresql merg join 討論,
我来答
分享
jack325
2024-03-20
postgresql merg join 討論,

大牛們好,請幫忙指導一下,奇怪的merge-join;

pg 中選錯執行計劃, 走 merge join, 不走 netsloop, 大家遇到過啊,請幫忙指導一二;

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
binguo2008

如果查询走了 Merge Join 而没有选择 Nested Loop Join,可能的原因如下:

#1.数据量较大:当参与连接的表数据量较大时,Merge Join 可能比 Nested Loop Join 更高效,因为 Merge Join 可以利用已经排序的数据进行连接操作,而不需要重复地进行循环嵌套;

#2.排序操作:Merge Join 需要连接的两个表都需要按照连接键进行排序,如果连接键上已经存在索引或者表数据本身已经有序,那么 Merge Join 可能是更好的选择;

#3.查询条件:如果查询条件中包含了范围查询或者是基于排序的条件,Merge Join 可能更适合这种情况,因为它可以更好地利用已排序的数据;

#4.统计信息不准确:优化器根据表的统计信息来做出选择,如果统计信息不准确或者过时,可能导致选择 Merge Join 而非 Nested Loop Join;

#5.查询配置参数:PostgreSQL 中有一些参数可以影响查询优化器的选择,比如 work_mem、join_collapse_limit 等,可能会影响连接算法的选择。

暂无图片 评论
暂无图片 有用 2
打赏 0
lianR

這可能是由於PostgreSQL查詢優化器的決定。查詢優化器會根據數據的統計信息、查詢的複雜性等因素來選擇最佳的執行計劃。在某些情況下,優化器可能會選擇使用Merge  Join而不是Nestloop。

如果你確定Nestloop會有更好的性能,你可以嘗試調整PostgreSQL的配置來影響優化器的決定。例如,你可以調整`enable_mergejoin`和`enable_nestloop`的值。設置`enable_mergejoin`為off可以禁用Merge  Join,設置`enable_nestloop`為on可以啟用Nestloop。

但是,請注意這樣做可能會影響到其他查詢的性能。在調整這些配置之前,建議先在測試環境中進行測試,並確保你了解這些變更的影響。

另外,你也可以使用`SET  LOCAL`語句來臨時改變這些配置,這樣只會影響當前的會話,而不會影響到其他會話。

例如:

```
SET  LOCAL  enable_mergejoin  =  off;
SET  LOCAL  enable_nestloop  =  on;
```

然後再執行你的查詢。這樣優化器就會優先考慮使用Nestloop。

暂无图片 评论
暂无图片 有用 2
打赏 0
jack325

嗯,提升 default_statistics 的统计样本数,可以解决;  说明表的数据,不均匀,具有一定的倾斜;

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
怎么通过heap_page_items和get_raw_page判断数据是提交了还是回滚了呢
回答 6
已采纳
一个事务只有4种状态,处理中,提交,回滚,子事务提交。在clog中用0,1,2,3表示,一个事务占2个bit位,一个字节可以存放4个事务。你按照这个规则算一下它在哪个块里的哪个位置呗,看下具体的值就可
用源码编译12版本,想要把postgreSQL12-plpython扩展编译进去,有什么办法?
回答 1
理论上在编译好源码后,进入contrib目录,进行插件编译,安装。cdcontribmakej8sudomakeinstall可以参考:https://www.modb.pro/db/401291
PostgreSQL中想新建一个用户,让他仅能访问指定数据表,不能通过客户端工具看到表结构和函数内容,是否有方案可解决?
回答 2
希望对你有所帮助
为了解决OLTP,希望做分布式,支持分词,应该如何选数据库?PostgreSQL 或MySQL ?
回答 1
已采纳
oraclemysqlpg都支持分词。PG比MySQL在全文索引上好一些。
postgreSQL数据库一直在starting是什么问题?
回答 2
已采纳
patroni的备机,如果数据目录是空的。启动patroni进程的时候是会自动从主库通过pgbasebackup拉取数据并建立同步关系的,而且,patroni带了rewind的功能。你可以确认下是不是
POSTGRESQL有什么办法能看外部表的大小?
回答 1
已采纳
在数据目录执行du命令duh/var/lib/pgsql/13/data/base
请问:Postgresql递归查询,使用ARRAY保存path, 出现数组数据类型错误应如何解决?见下图
回答 2
可以上传一下表结构看看
PostgreSQL怎么引用一个表的数据类型, 直接创建一个新的数据类型?
回答 2
表本身也是一个数据类型,可以直接使用
postgresql中的一个表内的多个唯一键约束,是共同作用还是某一个满足就触发?
回答 1
你要问的是一个键是 abc三列组成一个唯一这种吗?这种是共同的。如果说a唯一 b也是唯一   两个,那么理论一般没人这样用。但是如果这样,是分别触发。
pg中的复制槽功能在hadr架构下,如何实现的?
回答 1
在没有使用复制槽的情况下,可能需要用walkeepsize/walkeepsegment和archivecommand去确保wal日志不被删除,但这种方式总会保留过多的wal,且在延时较大时也不能保证