如何强制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 ...
随机推荐
- Hall定理(霍尔定理)证明及推广
引言 网络上有许多Hall定理的证明,但是对于Hall定理的几个推广的介绍却少之又少,因此本文来简单介绍一下 注:为了使这篇文章看起来简单易懂,本文将不会使用图论语言,会图论的朋友们可以自行翻译为图论 ...
- 23. 从零用Rust编写正反向代理,流控小姐姐的温柔一刀!
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...
- Kubernetes:kube-apiserver 之鉴权
kubernetes:kube-apiserver 系列文章: Kubernetes:kube-apiserver 之 scheme(一) Kubernetes:kube-apiserver 之 sc ...
- 嵌入式C编码规范
每个程序员都有自己的编码风格,自己喜欢就好. 嵌入式C编码规范 上述博文来自转载
- STM32CUBEIDE中 Debug 和 Release 的作用/区别/使用场景
基本主流IDE都有该功能选项例如Keil MDK, IAR, Eclipse, VS等, 这里使用STM32CUBEIDE来举例 创建STM32CUBEIDE工程后默认有2个目标选项 Debug / ...
- auto关键词
前言 这个东西在新版本的 C 语言中还是很常用的,尤其是用到 for 循环中.蒟蒻之前也是对这个了解不多,基本没用过(除非迫不得已,因为我的C++编译器太逊了,不支持此操作,用这个操作还得用在线 ID ...
- springboot在线人数统计
在线人数统计 笔者做了一个网站,需要统计在线人数. 在线有两种: 一.如果是后台系统如果登录算在线,退出的时候或者cookie.token失效的时候就算下线 二.如果是网站前台,访问的时候就算在线 今 ...
- 小傅哥带着你做 Java SDK 组件
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 大家好,我是技术UP主小傅哥. 今天小傅哥将开启一个新计划,带着大家一起干"开源&q ...
- 本地数据备份与FTP远程数据迁移
数据是电脑中最重要的东西.为了保证数据安全,我们经常会对数据进行备份.之前一直采用将重要数据拷贝至移动硬盘的方式实现备份,实现简单但每次都需要把所有文件拷贝一次,当文件很大时效率较低. 因此,考虑使用 ...
- C++ Qt开发:Slider滑块条组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍Slider滑 ...