计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
弹性伸缩 AS
镜像服务 IMS
专属主机 DeH
函数工作流 FunctionGraph
云手机服务器 CPH
Huawei Cloud EulerOS
网络
虚拟私有云 VPC
弹性公网IP EIP
虚拟专用网络 VPN
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
VPC终端节点 VPCEP
云连接 CC
企业路由器 ER
企业交换机 ESW
全球加速 GA
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
边缘安全 EdgeSec
威胁检测服务 MTD
CDN与智能边缘
内容分发网络 CDN
CloudPond云服务
智能边缘云 IEC
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
云搜索服务 CSS
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
数据可视化 DLV
数据湖工厂 DLF
湖仓构建 LakeFormation
企业应用
云桌面 Workspace
应用与数据集成平台 ROMA Connect
云解析服务 DNS
专属云
专属计算集群 DCC
IoT物联网
IoT物联网
设备接入 IoTDA
智能边缘平台 IEF
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
国际站常见问题
ICP备案
我的凭证
支持计划
客户运营能力
合作伙伴支持计划
专业服务
区块链
区块链服务 BCS
Web3节点引擎服务 NES
解决方案
SAP
高性能计算 HPC
视频
视频直播 Live
视频点播 VOD
媒体处理 MPC
实时音视频 SparkRTC
数字内容生产线 MetaStudio
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
存储容灾服务 SDRS
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
专属分布式存储服务 DSS
容器
云容器引擎 CCE
容器镜像服务 SWR
应用服务网格 ASM
华为云UCS
云容器实例 CCI
管理与监管
云监控服务 CES
统一身份认证服务 IAM
资源编排服务 RFS
云审计服务 CTS
标签管理服务 TMS
云日志服务 LTS
配置审计 Config
资源访问管理 RAM
消息通知服务 SMN
应用运维管理 AOM
应用性能管理 APM
组织 Organizations
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
应用身份管理服务 OneAccess
数据库
云数据库 RDS
文档数据库服务 DDS
数据管理服务 DAS
数据复制服务 DRS
云数据库 GeminiDB
云数据库 GaussDB
分布式数据库中间件 DDM
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
人脸识别服务 FRS
图引擎服务 GES
图像识别 Image
内容审核 Moderation
文字识别 OCR
AI开发平台ModelArts
图像搜索 ImageSearch
对话机器人服务 CBS
华为HiLens
视频智能分析服务 VIAS
语音交互服务 SIS
应用中间件
分布式缓存服务 DCS
API网关 APIG
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
多活高可用服务 MAS
事件网格 EG
企业协同
华为云会议 Meeting
云通信
消息&短信 MSGSMS
云生态
合作伙伴中心
云商店
开发者工具
SDK开发指南
API签名指南
Terraform
华为云命令行工具服务 KooCLI
其他
产品价格详情
系统权限
管理控制台
客户关联华为云合作伙伴须知
消息中心
公共问题
开发与运维
应用管理与运维平台 ServiceStage
软件开发生产线 CodeArts
需求管理 CodeArts Req
部署 CodeArts Deploy
性能测试 CodeArts PerfTest
编译构建 CodeArts Build
流水线 CodeArts Pipeline
制品仓库 CodeArts Artifact
测试计划 CodeArts TestPlan
代码检查 CodeArts Check
代码托管 CodeArts Repo
云应用引擎 CAE
开天aPaaS
云消息服务 KooMessage
云手机服务 KooPhone
云空间服务 KooDrive
更新时间:2022-07-29 GMT+08:00

运行倾斜的hint

功能描述

指明查询运行时重分布过程中存在倾斜的重分布键和倾斜值,针对Join和HashAgg运算中的重分布进行优化。

语法格式

  • 指定单表倾斜:
    1
    skew(table (column) [(value)])
    
  • 指定中间结果倾斜:
    1
    skew((join_rel) (column) [(value)])
    

参数说明

  • table表示存在倾斜的单个表名。
  • join_rel表示参与join的两个或多个表,如(t1 t2)表示t1和t2join后的结果存在倾斜。
  • column表示倾斜表中存在倾斜的一个或多个列。
  • value表示倾斜的列中存在倾斜的一个或多个值。
  • skew hint仅在需要重分布且指定的倾斜信息与查询执行过程中的重分布信息相匹配时才会被使用。
  • skew hint受GUC参数skew_option限制,如果参数处于关闭状态,则无法进行skew hint倾斜调优。
  • skew hint目前仅处理普通表和子查询类型的表关系,支持基表hint、子查询hint、with as子句hint。对于子查询,无论提升与否都支持在skew hint中使用,这点与其它hint不一样。
  • 对于倾斜表,如果定义了别名,则在hint中必须使用别名。
  • 对于倾斜列,在不产生歧义的情况下,可以使用原名也可以使用别名。skew hint的column不支持表达式,如果需要指定采用分布键为表达式的重分布存在倾斜,需要将重分布键指定为新的列,以新的列进行hint。
  • 对于倾斜值,个数需为列数的整数倍并按列的顺序进行组合,组合的个数不能超过10个。如果各倾斜列的倾斜值的个数不一样,为了满足按列组合,值可以重复指定。如,表t1的c1和c2存在倾斜,c1列的倾斜值只有a1,而c2列的倾斜有b1和b2,则skew hint如下:skew(t1 (c1 c2) ((a1 b1)(a1 b2)))。例中(a1 b1)为一个值组合,NULL可以作为倾斜值出现,每个hint中的值组合不超过十个, 且需为列的整数倍。
  • 在Join的重分布优化中,skew hint中的value不可缺省,在HashAgg中可以缺省。
  • 对于表、列、值中若指定多个,则同类间需以空格分离。
  • 对于倾斜值,不支持在hint中进行类型强转;对于string类型,需要使用单引号。

例如:

  • 指定单表倾斜

    每一个skew hint用来表示一个表关系存在的倾斜信息,如果想要指定在查询中的多个表关系存在的倾斜信息,则通过指定多个skew hint实现。

    在指定skew时,包括以下四个场景的用法:

    • 单列单值: skew(t (c1) (v1))

      说明:表关系t的c1列中的v1值在查询执行中存在倾斜。

    • 单列多值:skew(t (c1) (v1 v2 v3 ...))

      说明:表关系t的c1列中的v1、v2、v3…等值在查询执行中存在倾斜。

    • 多列单值:skew(t (c1 c2) (v1 v2))

      说明:表关系t的c1列的v1值和c2列的v2值在查询执行中存在倾斜。

    • 多列多值:skew(t (c1 c2) ((v1 v2) (v3 v4) (v5 v6) ...))

      说明:表关系t的c1列的v1、v3、v5…值和c2列的v2、v4、v6…值在查询执行中存在倾斜。

      多列多值时,各组倾斜值间也可以不使用括号,如:skew(t (c1 c2) (v1 v2 v3 v4 v5 v6 ...))。是否使用括号必须统一,不可混合,

      如:skew(t (c1 c2) (v1 v2 v3 v4 (v5 v6) ...)) 将会产生语法报错。

  • 指定中间结果倾斜

    如果基表不存在倾斜,而是查询执行中的中间结果出现倾斜,则需要通过指定中间结果倾斜的skew hint来进行倾斜的调优。skew((t1 t2) (c1) (v1))

    说明:表关系t1和t2 Join后的结果存在倾斜,倾斜的是t1表的c1列,c1列的倾斜值是v1。

    为了避免产生歧义,“c1”只能存在于join_rel的一个表关系中,如果存在同名列则通过别名进行规避。

建议

  • 如果查询具有多层,则哪一层出现倾斜,则将hint写在哪一层中。
  • 对于提升的子查询,skew hint支持直接使用子查询名进行hint。如果明确子查询提升后的哪一个基表存在倾斜,则直接使用基表进行hint的可用性更高。
  • 无论对于表或列,若存在别名,则优先使用别名进行hint。

示例

指定单表倾斜

  • 原query中进行hint。

    采用如下查询进行skew hint倾斜调优的举例,查询语句及不带hint的原计划如下所示:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    explain
    with customer_total_return as
    (select sr_customer_sk as ctr_customer_sk
    ,sr_store_sk as ctr_store_sk
    ,sum(SR_FEE) as ctr_total_return
    from store_returns
    ,date_dim
    where sr_returned_date_sk = d_date_sk
    and d_year =2000
    group by sr_customer_sk
    ,sr_store_sk)
     select  c_customer_id
    from customer_total_return ctr1
    ,store
    ,customer
    where ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2
    from customer_total_return ctr2
    where ctr1.ctr_store_sk = ctr2.ctr_store_sk)
    and s_store_sk = ctr1.ctr_store_sk
    and s_state = 'NM'
    and ctr1.ctr_customer_sk = c_customer_sk
    order by c_customer_id
    limit 100;
    

    对内层with子句中的HashAgg和外层的Hash Join进行hint指定,带hint的查询如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    explain
    with customer_total_return as
    (select /*+ skew(store_returns(sr_store_sk sr_customer_sk)) */sr_customer_sk as ctr_customer_sk
    ,sr_store_sk as ctr_store_sk
    ,sum(SR_FEE) as ctr_total_return
    from store_returns
    ,date_dim
    where sr_returned_date_sk = d_date_sk
    and d_year =2000
    group by sr_customer_sk
    ,sr_store_sk)
     select  /*+ skew(ctr1(ctr_customer_sk)(11))*/  c_customer_id
    from customer_total_return ctr1
    ,store
    ,customer
    where ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2
    from customer_total_return ctr2
    where ctr1.ctr_store_sk = ctr2.ctr_store_sk)
    and s_store_sk = ctr1.ctr_store_sk
    and s_state = 'NM'
    and ctr1.ctr_customer_sk = c_customer_sk
    order by c_customer_id
    limit 100;
    

    该hint表示:内层with子句中的group by在做HashAgg中进行重分布时存在倾斜,对应原计划的10和21号Hash Agg算子;外层ctr1表的ctr_customer_sk列在做Hash Join中进行重分布时存在倾斜,对应原计划的6号算子。生成计划如下所示:

    从优化后的计划可以看出:①对于Hash Agg,由于其重分布存在倾斜,所以优化为双层Agg;②对于Hash Join,同样由于其重分布存在倾斜,所以优化为采用新的重分布算子。

  • 需要改写query后进行hint

    不带hint的查询和计划如下:

    1
    explain select count(*) from store_sales_1 group by round(ss_list_price);
    

    由于hint中列不支持表达式,在进行倾斜优化时需要借助subquery改写查询,改写后的查询和计划如下:

    1
    2
    3
    4
    5
    explain 
    select count(*) 
    from (select round(ss_list_price),ss_hdemo_sk
    from store_sales_1)tmp(a,ss_hdemo_sk)                      
    group by a;
    

    改写注意不要影响到业务逻辑。

    采用改写后的查询进行hint,带hint的查询和计划如下:

    1
    2
    3
    4
    5
    explain 
    select /*+ skew(tmp(a)) */ count(*) 
    from (select round(ss_list_price),ss_hdemo_sk
    from store_sales_1)tmp(a,ss_hdemo_sk)                      
    group by a;
    

    从计划可以看出,对Hash Agg进行倾斜优化后,采用了双层agg实现,大大过滤了进行重分布时的数据量,减少了重分布时间。

    此外,需要说明的是,对于子查询,支持使用查询内部的列进行hint,如:

    1
    2
    3
    4
    5
    explain 
    select /*+ skew(tmp(b)) */ count(*) 
    from (select round(ss_list_price) b,ss_hdemo_sk
    from store_sales_1)tmp(a,ss_hdemo_sk)                      
    group by a;
    

我们使用cookie来确保您的高速浏览体验。继续浏览本站,即表示您同意我们使用cookie。 详情