百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

数据库中 SQL Hint 是什么? sql hql

yuyutoo 2024-10-24 17:52 9 浏览 0 评论

前言

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

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

什么是数据库 SQL Hint?

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 的解释,下面这张图比较清晰:
  3. Table 级别 -- Table 级别的 Hint 作用于比较好理解,就是作用于 Table Scan 的,同时 Table 的Hint 只能 Attach 所属的 Table Scan 上。

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

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 来干预数据库的优化,相当于留了一个后门。

数据库为什么需要 SQL Hint?

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

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

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

相关推荐

电脑 CMD 命令大全:简单粗暴收藏版

电脑CMD命令大全包括了许多常用的命令,这些命令可以帮助用户进行各种系统管理和操作任务。以下是一些常用的CMD命令及其功能:1、系统信息和管理...

电脑维修高手必备!8个神奇DOS命令,自己动手不求人

我相信搞电脑维修或者维护的基本都会些DOS的命令。就算Windows操作系统是可视化的界面,但很多维护检查是离不开DOS命令的。掌握好这些命令,你不仅能快速诊断问题,还能解决90%的常见电脑故障。下...

一个互联网产品总监的设计技巧总结 - 技术篇

古语:工欲善其事必先利其器。往往在利其器后我们才能事半功倍。从这个角度出发成为一个合格的产品经理你需要的是“利其器”,这样你才能产品的设计过程中如鱼得水,得心应手。有些产品经理刚入职,什么都感觉自己欠...

超详解析Flutter渲染引擎|业务想创新,不了解底层原理怎么行?

作者|万红波(远湖)出品|阿里巴巴新零售淘系技术部前言Flutter作为一个跨平台的应用框架,诞生之后,就被高度关注。它通过自绘UI,解决了之前RN和weex方案难以解决的多端一致性...

瑞芯微RK3568|SDK开发之环境安装及编译操作

1.SDK简介一个通用LinuxSDK工程目录包含有buildroot、app、kernel、device、docs、external等目录。其中一些特性芯片如RK3308/RV1108/R...

且看L-MEM ECC如何守护i.MXRT1170从核CM4

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M4内核的L-MEMECC功能。本篇是《简析i.MXRT1170Cortex-M7F...

ECC给i.MXRT1170 FlexRAM带来了哪些变化?

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7内核的FlexRAMECC功能。ECC是“ErrorCorrectingCode”...

PHP防火墙代码,防火墙,网站防火墙,WAF防火墙,PHP防火墙大全

PHP防火墙代码,防火墙,网站防火墙,WAF防火墙,PHP防火墙大全资源宝整理分享:https://www.htple.net...

从零开始移植最新版本(2023.10)主线Uboot到Orange Pi 3(全志H6)

本文将从零开始通过一步一步操作来实现将主线U-Boot最新代码移植到OrangePi3(全志H6)开发板上并正常运行起来。本文从通用移植思路的角度,展现是思考的过程,通过这种方式希望能让读者一通百...

可视化编程工具Blockly——定制工具箱

1概述本文重点讲解如何定制Blocklytoolbox上,主要包含如下几点目标:如何为toolbox不同类别添加背景色如何改变选中的类别的外观如何为toolbox类别添加定制化的css如何改变类别...

用户界面干货盘点(用户界面的基本操作方法)

DevExpressDevExpressWPF的DXSplashScreen控件在应用加载的时候显示一个启动界面。添加DXSplashScreen后,会默认生成一个XAML文件,当然,你也可...

Vue3+Bootstrap5整合:企业级后台管理系统实战

简洁而不简单,优雅而不失强大在当今快速发展的企业数字化进程中,高效、美观的后台管理系统已成为企业运营的核心支撑。作为前端开发者,我们如何选择技术栈,才能既保证开发效率,又能打造出专业级的用户体验?答案...

什么?这三款i.MXRT型号也开放了IAP API?

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1050/1020/1015系列ROM中的FlexSPI驱动API使用。今天痞子衡去4S店给爱车做保养了,...

OneCode基础组件介绍——表格组件(Grid)

在企业级应用开发中,表格组件是数据展示与交互的核心载体。OneCode平台自研的Grid表格组件,以模型驱动设计...

开源无线LoRa传感器(光照温湿度甲醛Tvoc)

本开源项目基于ShineBlinkC2M低代码单片机实现,无需复杂单片机C语言开发。即使新手也可很容易用FlexLua零门槛开发各种功能丰富稳定可靠的IoT硬件,更多学习教程可参考Flex...

取消回复欢迎 发表评论: