如何强制SQL走性能更优的hash join
本文分享自华为云社区《【SQL优化】为什么有时候无法走执行性能更优的hashjoin》,作者: leapdb。
1. hash join通常优于nestloop join
1. 在session级关闭nestloop方式,set enable_nestloop to off;
CREATE DATABASE test_td WITH DBCOMPATIBILITY='td'; create table dim_day(day_code char(8));
create table dwr_rpo as select current_date - 1 as day_code; --返回了date类型 test_td=# \d+ dwr_rpo
Table "public.dwr_rpo"
Column | Type | Modifiers | Storage | Stats target | Description
----------+------+-----------+---------+--------------+-------------
day_code | date | | plain | |
Has OIDs: no
Distribute By: ROUND ROBIN
Location Nodes: ALL DATANODES
Options: orientation=row, compression=no explain select *
from dwr_rpo a
left join dim_day c
on c.day_code = a.day_code; id | operation | E-rows | E-distinct | E-memory | E-width | E-costs
---+----------------------------------------------+---------+------------+----------+---------+--------------
1 | -> Streaming (type: GATHER) | 1310148 | | | 1694 | 279235196.70
2 | -> Nested Loop Left Join (3, 4) | 1310148 | | 1MB | 1694 | 279229682.93
3 | -> Seq Scan on dwr_rpo a | 1310148 | | 1MB | 1676 | 46589.16
4 | -> Materialize | 109575 | | 16MB | 22 | 3747.76
5 | -> Streaming(type: BROADCAST) | 109575 | | 2MB | 22 | 3565.14
6 | -> Seq Scan on dim_day c | 36525 | | 1MB | 22 | 272.75 Predicate Information (identified by plan id)
-----------------------------------------------------------------------------
2 --Nested Loop Left Join (3, 4)
Join Filter: ((c.day_code)::timestamp without time zone = a.day_code)

不同数据类型计算hash函数不同,互不兼容的数据类型无法进行hash比较。
nestloop复杂度:131w * 10w = 1310亿
hashjoin复杂度:131w
看似类型相近,但由于两端的精度,格式,有无时区等不一样,无法认为直接相等。
select oprname,oprkind,oprcanhash,
(select typname from pg_type where oid=oprleft) oprleft,
(select typname from pg_type where oid=oprright) oprright
from pg_operator
where oprname='=' and oprcanhash='f'; oprname | oprkind | oprcanhash | oprleft | oprright
---------+---------+------------+---------------+---------------
= | b | f | xid | int8
= | b | f | xid32 | int4
= | b | f | tid | tid
= | b | f | box | box
= | b | f | path | path
= | b | f | tinterval | tinterval
= | b | f | money | money
= | b | f | circle | circle
= | b | f | lseg | lseg
= | b | f | line | line
= | b | f | bit | bit
= | b | f | varbit | varbit
= | b | f | date | timestamp
= | b | f | date | timestamptz
= | b | f | timestamp | date
= | b | f | timestamptz | date
= | b | f | timestamp | timestamptz
= | b | f | timestamptz | timestamp
= | b | f | tsvector | tsvector
= | b | f | tsquery | tsquery
= | b | f | record | record
= | b | f | hll | hll
= | b | f | hll_hashval | hll_hashval
= | b | f | roaringbitmap | roaringbitmap
(24 rows)
current_date 在TD兼容模式下为date类型;
如何强制SQL走性能更优的hash join的更多相关文章
- sql server 性能调优 资源等待之网络I/O
原文:sql server 性能调优 资源等待之网络I/O 一.概述 与网络I/O相关的等待的主要是ASYNC_NETWORK_IO,是指当sql server返回数据结果集给客户端的时候,会先将结果 ...
- sql server 性能调优之 资源等待PAGELATCH
一.概述 在前几章介绍过 sql server 性能调优资源等待之PAGEIOLATCH,PAGEIOLATCH是出现在sql server要和磁盘作交互的时候,所以加个IO两个字.这次来介绍PAGE ...
- sql server 性能调优之 CPU消耗最大资源分析1 (自sqlserver服务启动以后)
一. 概述 上次在介绍性能调优中讲到了I/O的开销查看及维护,这次介绍CPU的开销及维护, 在调优方面是可以从多个维度去发现问题如I/O,CPU, 内存,锁等,不管从哪个维度去解决,都能达到调优的效 ...
- CPU开销sql server 性能调优
sql server 性能调优 CPU开销分析 一. 概述 上次在介绍性能调优中讲到了I/O的开销查看及维护,这次介绍CPU的开销及维护, 在调优方面是可以从多个维度去发现问题如I/O,CPU, 内存 ...
- 【目录】sql server 性能调优
随笔分类 - sql server 性能调优 sql server 性能调优之 资源等待之网络I/O 摘要: 一.概述 与网络I/O相关的等待的主要是ASYNC_NETWORK_IO,是指当sql s ...
- PHP日志扩展 SeasLog-1.6.8, 性能更优
SeasLog-1.6.8 发布了,性能更优. 改进日志: 1.6.8: 优化内存使用和性能,修复已知Bug. - Fixed issue #97 PHP5.* Cached Block. - Fix ...
- SQL server 性能调优
转自: http://www.cnblogs.com/MR_ke/archive/2010/08/25/1807856.html sql 2005性能调优 SQL Server在运行一段时间,随着数据 ...
- SQL Server 性能调优培训引言
原文:SQL Server 性能调优培训引言 大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤 ...
- sql server 性能调优之 资源等待 LCk
一. 概述 这次介绍实例级别资源等待LCK类型锁的等待时间,关于LCK锁的介绍可参考 “sql server 锁与事务拨云见日”.下面还是使用sys.dm_os_wait_stats 来查看,并找出 ...
- sql server性能调优
转自:https://www.cnblogs.com/woodytu/tag/%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98%E5%9F%B9%E8%AE%AD/defaul ...
随机推荐
- js滚动条滚动到底部和顶部
<!DOCTYPE html> <html> <head> <title></title> <style type="tex ...
- DeepSpeed: 大模型训练框架
背景: 目前,大模型的发展已经非常火热,关于大模型的训练.微调也是各个公司重点关注方向.但是大模型训练的痛点是模型参数过大,动辄上百亿,如果单靠单个GPU来完成训练基本不可能.所以需要多卡或者分布式训 ...
- Atcoder Regular Contest 166
只打了半场. A. Replace C or Swap AB 首先如果存在某个 \(i\),使得 \(Y_i\) 是 C 且 \(X_i\) 不是,那么显然是不合法的,可以直接判掉. 那么除去上述情况 ...
- 2023 PolarD&N靶场通关笔记 Crypto
简单类: keyboard2.0 21 31 41 53 63 73 62 72 82 81 91 01 51 61 71 提示:解出来的内容转换为md5值后加上flag{} 数字被分成五组,每组包含 ...
- C语言【编译器、变量、输入输出有关的】
C语言[编译器.变量.输入输出有关的] 一些想到的[从编译器到变量到输入输出有关的]的问题,有些是按自己理解写的答,有些待解决. C语言可以跨平台,汇编不可以,编译时C语言会根据不同系统翻译成不同形式 ...
- 关联规则挖掘:Apriori算法的深度探讨
在本文中,我们深入探讨了Apriori算法的理论基础.核心概念及其在实际问题中的应用.文章不仅全面解析了算法的工作机制,还通过Python代码段展示了具体的实战应用.此外,我们还针对算法在大数据环境下 ...
- iOS信号量造成线程优先级反转
在并发队列使用信号量会可能会造成线程优先级反转 一.在iOS16 & XCode14上遇到 - 使用信号量造成线程优先级反转问题 提醒 经过查询资料,发现是在XCode14上增加了工具,比如 ...
- Android的内部存储和外部存储怎么区分?
1.定义 内部存储:内部存储位于Android手机系统的data/data/<包名>这个目录下,内部存储是私有的,主要用于存储系统和应用程序的某些数据,对于其他应用程序来说是不可见的,并且 ...
- Codeforces Round #656 (Div. 3) E. Directing Edges(拓扑排序)
题目传送门 首先发现初始图五有向环的话那么肯定是"YES",否则是"NO".然后找到一种满足要求地建树规则即可.这里采用拓扑排序建树,先dfs找出目前点的拓扑序 ...
- StackGres 1.6 数据库平台工程功能介绍以及快速上手
StackGres 1.6 数据库平台工程功能 声明式 K8S CRs StackGres operator 完全由 Kubernetes 自定义资源管理.除了 kubectl 或任何其他 Kuber ...