从Hash Join的执行计划的细节中能看到点啥

​HASH JOIN是大数据量表连接中最为常用的方式,与最为常用的NESTED LOOP相比,其应用场景不同。对于两张表的连接,NESTED LOOP适合于类似查电话号码的应用场景,如果领导给你一张清单,让你去查一下几家企业的电话号码,那么你要做的是找到一本电话号码本,根据公司名称的索引,挨个查一遍,很快就可以完成了。这种方式就是著名的NESTED LOOP,通过数个快速的循环,完成两个行源的关联操作(待查清单,电话号码簿)。

如果这个任务改一下,领导给你的清单上有几万家企业,那么我们还这么一条条的去查,那不傻了。这时候,就不适合用NESTED LOOP循环了,HASH JOIN是比较快速的解决方法。很多SQL的执行计划出现错误,有很大一部分就是选择错误使用了NESTED LOOP和HASH JOIN。因此现在一些CBO的优化器中,都有针对NESTED LOOP和HASH JOIN的主动纠偏技术。Oracle 19C的可调节执行计划主要就是在执行NESTED LOOP的过程中一旦发现循环数量超出评估预期,则可以动态改为HASH JOIN。

刚开始就有点扯远了,今天我们的重点不是讨论NL和HASH JOIN的差异,而是带大家看看PG数据库的HASH JOIN执行计划中的一些容易被忽略的点,在查看执行计划的时候,如果能够比较好的抓住这些关注点,对于SQL优化来说很有帮助。

可能有朋友要说了,反正都是HASH JOIN,执行计划都差不多,有啥可看的。那么我们来看看上面的执行计划里的红框里的内容吧,Batches :32,这个是啥意思?如果你以前是Oracle DBA,那么优化排序、one-pass 排序,multi-pass排序的概念应该还有印象吧。当需要做排序或者HASH TABLE的数据量太大,超出了SORT AREA SIZE的限制,那么这次排序/HASH join就无法一次完成,必须切分为多个分区,一个个的完成。在PG的HASH JOIN里,就是把HASH JOIN切分为多个BATCHES。因为某个BATCH完成后需要暂存在临时文件中,因此遇到这种情况我们一般都可以看到temp written这个内容,这部分内容我也用红框标注出来了。

这种排序区不足导致的问题会带来什么样的性能问题呢?我们来看这个例子,BATCHES:1,也就是无需通过分区完成,此时使用了4540KB的WORK_MEM。实际上我给大家演示这个案例的时候,第一个例子用了256KB的work_mem设置,当然无法满足4M多的内存需求了。而第二个例子我使用了一个极大的work_mem(256MB),当然实际上的内存使用以执行计划中的为准。一次性在内存中完成HASH JOIN的好处是什么呢?当然是执行效率,我们可以看出第二个执行只用了90毫秒,而分裂为32个BATCH的执行花了239毫秒。

看到这里可能有朋友要说了,既然效果那么好,那么我们把WORK_MEM参数设的足够大不就行了。实际上设置过大的WORK_MEM也是存在隐患的。如果我们的物理内存不是很大,那么设置过大的WORK_MEM可能导致极端情况下,物理内存过度消耗而导致更严重的问题。

WORK_MEM参数是可会话级动态设置的,如果我们的某些要做大型排序或者HASH JOIN的SQL能够在应用层面做设置,执行大型SQL的时候设置一个较大的值,SQL执行完毕RESET一下参数,这样WORK_MEM的使用效率是最高的。否则我们为了满足大型SQL的需求,就需要设置一个做大值。当然虽然我们设置了WORK_MEM并不一定就会消耗那么多的内存,不过活跃会话数*WORK_MEM这个数字还是需要关注的,确保我们的物理内存有那么多的空闲可用(参考可用内存,而不是FREE内存)是十分必要的。如果我们不确定系统最大的内存使用量,并且物理内存比较紧张,那么设置大一点的SWAP是十分必要的,在极端情况下可以确保系统不会因为OOM而出大问题。

上面的这个执行计划也是我们经常看到的,PG数据库支持并行HASH JOIN,并且默认是打开的。如果我们的系统中的CPU资源是充足的,那么enable_parallel_hash参数确保打开状态就行了。并行HASH JOIN可以通过过parallel seq scan和parallel hash join两种机制来进一步提高HASH JOIN的性能。我们可以看到,通过并发,这个SQL的执行效率进一步的提升了。

不过任何事情都是有利有弊,如果你的服务器的CPU资源十分紧张,那么过多的并行HASH JOIN可能会导致你的CPU资源经常出现不足,引发其他问题。如果存在这种情况,那么关闭并行HASH JOIN,让每个HASH JOIN变得略微慢一点,但是确保CPU资源不过载,也是一种策略。​

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/299219.html<

(0)
运维的头像运维
上一篇2025-05-23 07:29
下一篇 2025-05-23 07:30

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注