前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一学系列数据库篇(1):数据库中 SQL Hint 是什么?

每日一学系列数据库篇(1):数据库中 SQL Hint 是什么?

作者头像
LakeShen
发布2024-03-18 19:49:38
2720
发布2024-03-18 19:49:38
举报
文章被收录于专栏:数据库和大数据技术原理解析
后面每日一学,我打算做成一个系列,也就是每天和大家分享一些有价值的内容,包括数据库技术、量化交易、程序员经验、投资理财、工作提效等等,只要我认为有价值的东西,我都会分享出来,感兴趣的同学,也可以先关注我了解下。

最近在调研业界其他数据库中 SQL Hint 功能的设计和实现,整体上对 Oracle、Mysql、Postgresql、 Apache Calcite 中的 SQL Hint 的设计和功能都进行了解,这里整理一篇文章来对其进行梳理,一是帮助自己未来回顾,加深自己的思考,二是也能帮助大家更好的了解数据库 SQL Hint 的实现原理。

由于我是做数据库引擎开发的,所以每日一学系列,就先以数据库技术作作为开头,我估计我最少会写几十篇内容来介绍数据库技术吧,每天分享一个点,来帮助大家理解数据库的使用和原理,分享的内容我应该会逐渐由浅入深,好了,今天的主题开始。

01

什么是数据库 SQL Hint

Enjoy life

A HAPPY LIFE AFTER RAIN

SQL Hint 是一种能够让用户干预数据库 SQL 优化的方式,相当于给用户开了一个后门,当数据库本身对于某些 SQL 优化的不够好时,那么用户就可以结合自己的经验,尝试使用 Hint 来干预数据库的优化。

举个列子,比如能够让用户指定 SQL 查询 Join Order 的顺序、单个 Query 级别的 Session 参数等等。

虽然数据库 SQL 优化器在大部分场景已经能够产出较优的计划,但可能存在某些复杂场景,比如基数评估不准等,可能会导致最终的计划性能较低,此时用户就可以通过 SQL Hint 的方式,来干预优化器的计划产生,从而产出更优的计划。

数据库 SQL Hint 的一般有两种格式:以/*+开头的一种特殊的 SQL 注释(比如 Oracle、Mysql)和 SQL 关键字(比如 SQL Server),业界比较多的设计是前面这扬中,也就是 SQL 注释。

由于数据库 SQL Hint 是 SQL 注释,这不会破坏 SQL 标准和兼容性,在 Oracle、Mysql 中,SQL Hint 必须出现在 Select、Insert、Update 等 SQL 关键字后面。多个 Hint 之间可以是“,”进行分隔,也可以是空格分隔。

对于 SQL Hint 的作用域,一般可以划分为三种类型:

  1. 单个 Query 级别 -- 对于 Query 级别的 Hint,即 Hint 作用于是整个 Query 级别的,比如 Query 的 Session 参数,资源组的配置
  2. 一个 Query 中 的 Query Block 级别 -- Query Block 级别的 Hint,一般作用于所属的 Query Block,对于 Query Block 的解释,下面这张图比较清晰:
  1. Table 级别 -- Table 级别的 Hint 作用于比较好理解,就是作用于 Table Scan 的,同时 Table 的Hint 只能 Attach 所属的 Table Scan 上。

下面是一个使用 SQL Hint 的 SQL:

代码语言:javascript
复制
SELECT 
/*+ HASH_JOIN(e, d),RESOURCE(mem='128mb', parallelism='24')*/ 
  e.last_name, 
  d.location_id 
FROM 
  employees e, 
  departments d 
WHERE 
  e.dep_id = d.dep_id;

/*+ HASH_JOIN(e, d),RESOURCE(mem='128mb', parallelism='24') */表示有两个 Hint,第一个表示employees和departments的 Join 实现方式使用 HashJoin。第二个 Hint 表示这个 Query 使用资源的配置,每个 Task 128 MB,并发度为 24.w。

SQL Hint 是一种能够让用户干预数据库 SQL 优化的方式,相当于给用户开了一个后门,当数据库本身对于某些 SQL 优化的不够好时,那么用户就可以结合自己的经验,尝试使用 Hint 来干预数据库的优化,相当于留了一个后门。

02

数据库为什么需要 SQL Hint

Enjoy life

A HAPPY LIFE AFTER RAIN

前面有说到,需要 SQL Hint 的核心原因,是希望为优化器提供一种人工可干预的优化手段。

对于客户侧存在某些特殊场景的一些问题,对于这种特殊 Case,优化器可能不能发挥比较好的优化,从而会导致查询时间很久,此时我们期望能够以很小的成本,能够手动干预和介入到优化中,来解决客户现场的问题。

对于用户而言,我们期望其尽可能少的感知到自己需要手工优化的点,尽可能多的让优化器来做这些优化以及产出一个较好的优化计划。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LakeShen 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档