doris:使用 Hint 控制代价改写

news/2025/2/24 5:30:37/

概述​

查询优化器在生成执行计划的过程中,会应用一系列规则。这些规则主要分为两类:基于规则的优化(Rule-Based Optimizer 即 RBO)和基于代价的优化(Cost-Based Optimizer 即 CBO) 。

  • RBO:此类优化通过应用一系列预定义的启发式规则来改进查询计划,而不考虑具体的数据统计信息。例如,谓词下推、投影下推等策略均属于此类。
  • CBO:此类优化则利用数据统计信息来估算不同执行计划的代价,并选择代价最小的计划进行执行。这包括访问路径的选择、连接算法的选择等。

在某些情况下,数据库管理员或开发人员可能需要对查询优化过程进行更为精细的控制。基于此,本文档将介绍如何使用查询 Hint 来管理 CBO 规则。

注意

当前 Doris 已经具备良好的开箱即用的能力,也就意味着在绝大多数场景下,Doris 会自适应的优化各种场景下的性能,无需用户来手工控制 hint 来进行业务调优。本章介绍的内容主要面向专业调优人员,业务人员仅做简单了解即可。

CBO 规则控制 Hint 的基本语法如下所示:

SELECT /*+ USE_CBO_RULE(rule1, rule2, ...) */ ...

此 Hint 紧跟在 SELECT 关键字之后,并在括号内指定要启用的规则名称(规则名称不区分大小写)。

当前 Doris 优化器支持若干中代价改写,可以通过 USE_CBO_RULE hint 来显式启用,例如:

  • PUSH_DOWN_AGG_THROUGH_JOIN
  • PUSH_DOWN_AGG_THROUGH_JOIN_ONE_SIDE
  • PUSH_DOWN_DISTINCT_THROUGH_JOIN

案例​

查询示例如下:

explain shape planselect /*+ USE_CBO_RULE(push_down_agg_through_join_one_side) */a.event_id,b.group_id,COUNT(a.event_id)from ajoin b ona.device_id = b.device_idgroup bya.event_id,b.group_id;

在此示例中启用了一个聚合下推 CBO 规则。这一操作可以使表 a 能够在连接操作之前进行提前聚合,减少连接的开销,加速查询。下压后的计划如下:

PhysicalResultSink
--hashAgg[GLOBAL]
----hashAgg[LOCAL]
------hashJoin[INNER_JOIN] hashCondition=((a.device_id = b.device_id)) otherCondition=()
--------hashAgg[LOCAL]
----------PhysicalOlapScan[a]
--------filter((cast(experiment_id as DOUBLE) = 73.0))
----------PhysicalOlapScan[b]

总结​

合理使用 USE_CBO_RULE hint,可以帮助手动启用部分高级 CBO 优化规则,在特定场景下优化性能。但是使用 CBO 优化规则需要对查询优化过程和数据特性有深入的理解,在大多数情况下,依赖 Doris 优化器的自动决策仍然是最佳的选择。


http://www.ppmy.cn/news/1574557.html

相关文章

【项目日记】仿RabbitMQ实现消息队列 --- 模块设计

你要的答案不在书本里, 也不能靠别人来解决, 除非你想一辈子当小孩。 你必须在自我内部找到答案, 感受到该做的正确事情。 --- 《献给阿尔吉侬的花束》--- 仿RabbitMQ实现消息队列 1 数据管理模块1.1 交换机数据管理模块1.2 队列数据管…

请求go构建缓存,go clean -cache

go clean -cache go 构建时会产生很多缓存, 一般是目录:/Users/xxx/Library/Caches/go-build 此目录README: This directory holds cached build artifacts from the Go build system. Run "go clean -cache" if the directory …

DeepSeek R1/V3满血版——在线体验与API调用

前言:在人工智能的大模型发展进程中,每一次新模型的亮相都宛如一颗投入湖面的石子,激起层层波澜。如今,DeepSeek R1/V3 满血版强势登场,为大模型应用领域带来了全新的活力与变革。 本文不但介绍在线体验 DeepSeek R1/…

力扣——多数元素

题目链接: 链接 题目描述: 思路: 摩尔投票法:核心理念为票数正负抵消 众数投票1,否则 -1最后票数和一定>0去掉前面票数和为0的数,剩下的数里面,众数不会变假设某个数是众数,前…

HarmonyOS学习第3天: 环境搭建开启鸿蒙开发新世界

一、引言 在数字化时代,操作系统作为连接用户与硬件设备的桥梁,其重要性不言而喻。HarmonyOS 作为华为公司推出的面向全场景的分布式操作系统,以其创新的理念和卓越的性能,正逐渐在全球范围内崭露头角。它打破了设备之间的界限&a…

Pytorch的F.cross_entropy交叉熵函数

参考笔记:pytorch的F.cross_entropy交叉熵函数和标签平滑函数_怎么给crossentropyloss添加标签平滑-CSDN博客 先来讲下基本的交叉熵cross_entropy,官网如下:torch.nn.functional.cross_entropy — PyTorch 1.12 documentation torch.nn.fun…

基于 PyQt5 实现分组列表滚动吸顶效果

基于 PyQt5 实现分组列表滚动吸顶效果 在很多应用场景中,例如 QQ 好友列表,我们都需要展示大量分组数据,同时希望在滚动时分组标题始终固定显示在顶部,提升用户体验。本文将详细介绍如何利用 PyQt5 实现类似效果——在滚动区域中…

全局错误处理如何与Vue Router集成?

将全局错误处理与 Vue Router 集成可以确保在应用中处理错误的一致性,并在用户遇到未授权访问或其他错误时提供适当的反馈。以下是如何将全局错误处理与 Vue Router 集成的步骤和示例。 1. 设置全局错误处理 首先,您可以在 main.js 文件中设置全局错误…