搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Monodyee
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
【SQL语句】创建数据库 建表操作_sql语句创建数据库表
2
(病理图像读写)病理图像(whole slide images,WSI)的读写(.svs, .tiff),使用openslide,和pyvips以及matlab_svs格式图处理python
3
鼠标键盘共享工具Synergy常见问题_synergy正在启动
4
资源包:Unity
5
EMQX+PolarDB-X构建一站式物联网数据解决方案_emqx 怎么做物联
6
鸿蒙支持java,鸿蒙Java开发模式9:鸿蒙牛气冲天动画及鸿蒙UltimateProvider组件
7
IntelliJ IDEA 2023.2正式发布,引入AI助手和GitLab集成,升级你的开发体验!( IDEA 2023.2彻底弃用Struts2,不支持Win7)_idea ai assistant
8
图解CNN中的卷积(卷积运算、池化、Padding、多通道的卷积)_多通道卷积神经网络
9
php笔试面试题大全
10
使用Xcode 11.4在模拟器中测试推送通知_xcrun simctl push booted com.proton.yamimeal.test
当前位置:
article
> 正文
查询优化技术概念_简述查询优化的含义
作者:Monodyee | 2024-03-13 20:36:12
赞
踩
简述查询优化的含义
本文摘取自《数据库查询优化器的艺术》
一、查询优化技术简介
查询优化技术主要包括查询重用技术、查询重写规则技术、查询算法优化技术、并行查询的优化技术、分布式查询优化技术和其他优化技术6个方面的技术。
1.1 查询重用
查询重用是指尽可能利用先前的执行结果,以达到节约查询计算全过程的时间并减少资源消耗的目的。
目前查询重用技术主要集中在两个方面:
查询结果的重用。在缓存区中分配一块缓冲块,存放该SQL语句文本和最后的结果集,当遇到同样的SQL输入是,可直接把结果返回。查询结果的重用技术节约了查询计划生成事件和查询执行过程的时间,减少了查询执行全过程的资源消耗。
查询计划的重用。缓存一条查询语句的执行计划及其相应语法树结构。查询计划的重用技术减少了查询计划生成的时间和资源消耗。
查询重用技术有利有弊:弊端,如结果集很大会消耗很大的内存资源,同样的SQL不同用户获取的结果集可能不完全相同;益处,节约了CPU和IO消耗。在使用过程中,趋利避害,应根据实际情况选用。
1.2 查询
重写
规则
查询重写是查询语句的一种等价转换,即对于任何相关模式的任意状态都会产生相同的结果(相同的关系替代两个表达式中相应的关系,所得到的结果是相同的)。查询重写有两个目标:
将查询转换为等价的、效率更高的形式,例如将效率低的谓词转换为效率高的谓词、消除重复条件等。
尽量将查询重写为等价、简单且不受表顺序限制的形式,为物理查询优化阶段提供更多的选择,如视图的重写、子查询的合并转换等。
查询重写的一句,是关系代数。关系代数的等价变换规则对查询重写提供了理论上的支持。查询重写后,查询优化器可能生成多个连接路径,可以从候选者中择优。
对查询优化技术进行分类,可有以下4个角度:
语法级。查询语言层的优化,基于语法进行优化
代数级。查询使用形式逻辑进行优化,运用关系代数的原理进行优化
语义级。根据完整性约束,对查询语句进行语义理解,推知一些可优化的操作
物理级。物理优化技术,基于代价估算模型,比较得出各种执行方式中代价最小的。
查询重写是基于语法级、代数级、语义级的优化,可以统一归属到逻辑优化的范畴:基于代价估算模型是物理层面的优化,是从连接路径中选择代价最小的路径的过程。
查询重写技术优化思路主要包括:
将过程性查询转换为描述性的查询,如视图重写
将复杂的查询(如嵌套子查询、外连接、嵌套连接)尽可能转换为多表连接查询
将效率低的谓词转换为等价的效率高的谓词(如等价谓词重写)
利用等式和不等式的性质,简化WHERE、HAVING和ON条件
如何改进现有查询重写规则的效率,如何发现更多更有效的重写规则,是查询优化的研究内容之一。常见的查询重写技术类型,每一类都有自己的规则,这些规则每月确定的、统一的规律。但重写的核心一定是”等价转换”,只有等价才能转换,这是需要特别强调的。
1.3 查询算法优化
查询优化即求解给定查询语句的高效执行计划的过程。
查询计划,也成为查询树,它由一系列内部的操作符组成,这些操作按一定的运算关系构成查询的一个执行方案。
查询优化的目的就是生成最好的查询计划。通常有以下两个策略:
基于规则优化。根据经验或一些已经探知或被证明有效的方式,定义为规则。用这些规则简化查询计划生成过程中符合可被简化的操作,使用启发式规则排除一些明显不好的存取路径,这就是基于规则的优化。 ???基于规则的优化和查询重写有什么区别???
基于代价优化。根据一个代价评估模型,在生成查询计划的过程中,计算每条存取路径的花费,然后选择代价最小的作为子路径,这样直至所有表连接完毕得到一个完整的路径。
1.4 并行查询优化
在并行数据库系统中,查询优化的目的是寻找具有最小响应时间的查询执行计划,这需要把查询工作分解为一些可以并行运行的自工作。
一个查询是否能并行执行,取决于以下因素:
系统中可用资源(如内存、缓存等)
CPU
运算中特定代数运算符。在同一个SQL内,查询并行可以分为以下几种
操作内并行:将同一操作分解成多个独立的子操作,由不同的CPU同时执行
操作间并行:一条SQL查询语句可以分解成多个子操作,由多个CPU执行
1.5
分布式
查询优化
在分布式数据库系统中,查询策略优化(主要是数据传输策略)和局部处理优化(传统的单节点数据库的查询优化技术)是查询优化的重点。
在查询优化策略中,数据的通信开销是优化算法考虑的主要因素。分布式查询优化以减少传输的次数和数据量作为查询优化的目标。
在分布式数据库系统中,代价估算模型如下:
总代价 = IO代价 + CPU代价 + 通信代价
1.6 其他优化
如数据库集群系统中的SD(Share Disk)集群和SN(Share Nothing)集群。
二、逻辑查询优化
查询优化器在逻辑优化阶段主要解决的问题是:如何找出SQL语句等价的变换形式,使得SQL执行更高效。
逻辑查询优化的思路包括:
子句局部优化,如等价谓词重写、WHERE和HAVING条件简化。
子句间关联优化,如外连接消除、连接消除、子查询优化、视图重写等,它们的优化都需要借助其他子句、表定义或列属性等信息进行
局部与整体优化,需要协同考虑局部表达式和整体的关系,如OR重写并集规则需要考虑UNION操作的花费和OR操作的花费
形式变化优化,多个子句存在嵌套,可以通过形式的变化完成优化,如嵌套连接消除。
语义优化,根据完整性约束,SQL表达的含义等信息对语句进行语义优化
其他优化,根据一些规则对非SPJ做的其他优化。根据硬件环境进行的并行查询优化。
2.1 关系代数基础
关系代数是关系型数据库查询语言的基础。关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。
关系代数的运算符包括以下4类:
传统集合运算符。并UNION、交INTERSECTION、差DIFFERENCE、积EXTENDED CARTESIAN PRODUCT
专门的关系运算符。选择SELECT、投影PROJECT、连接JOIN、除DIVEDE
辅助运算符。包括算术比较符和逻辑运算符
关系扩展运算符。如半连接SEMIJOIN、半差SEMIDIFFERENCE、扩展EXTEND、合计COMPOSITION、传递闭包TCLOSE
2.2 查询重写规则
传统的OLTP使用基于选择(SELECT)(选择类似于filter)、投影(PROJECT)、连接(JOIN)3种基本操作相结合的查询,这种查询成为SPJ查询。
数据库针对SPJ查询有一系列的优化规则,如下:
选择操作:优化方式是选择操作下推,目的是尽量减少连接操作前的元组数,使得中间临时关系尽量少,减少IO和CPU消耗,节约内存空间
投影操作:优化方式是投影操作下推,目的是尽量减少连接操作前的列数,使得中间关系尽量小,节约内存空间
连接操作:这里涉及以下两个子问题
多表连接中每个表被连接的顺序决定着效率
多表连接每个表被连接的顺序由用户语义决定
2.2.1 子查询的优化
子查询是查询语句中经常出现的一种类型,是比较耗时的操作。优化子查询对查询效率的提升有着直接的影响,所以子查询优化技术,是数据库查询优化引擎的重要研究内容。
从子查询出现在SQL语句的位置看,它可以出现在目标列、FROM子句、WHERE子句、JOIN/ON子句、GROUPBY子句、HAVING子句、ORDERBY子句等维值。子查询出现在不同维值对优化的影响如下:
目标列位置:子查询只能是标量子查询,只能返回一个字段
FROM子句位置:不能是相关子查询
WHERE子句位置:作为表达式的一部分,需要符合操作符和操作数的规范
JOIN/ON子句位置:JOIN同FROM,ON同WHERE
GROUPBY子句位置:目标列必须和GROUPBY关联(在GROUPBY中就必须在SELECT中)
ORDERBY子句位置:子查询在ORDERBY子句上没有实际意义
2.2.1.1 子查询分类
根据子查询中涉及的关系对象与外层关系对象间的关系,子查询可以分为以下两类:
相关子查询:子查询依赖于外层父查询的一些属性值
非相关子查询:子查询具有独立性,可以独自求解,形成一个子查询计划先于外层的查询求解
从语句构成的复杂程度看,可以分为以下三类:
SPJ子查询
GROUPBY子查询
其他子查询
从结果集的角度看,可以分为以下四类:
标量子查询:返回一个单一值
列子查询:返回一条单一列
行子查询:返回一个单一元组
表子查询:返回多行多列
2.2.1.2 子查询的优化思路
子查询合并:在某些条件下(语义等价:两个子查询产生同样的结果集),多个子查询能够合并成一个子查询,减少表扫描次数
子查询展开:又称为子查询上拉,即把某些子查询重写为等价的多表连接操作。减少查询层次
聚集子查询消除:聚集函数上推,将子查询转变为一个新的不包含聚集函数的子查询,并与父查询的部分或全部表做左外连接
2.2.2 视图重写
视图重写就是将对视图的引用重写为对基本表的引用。视图重写后的SQL多被元作为子查询进行进一步优化。所有的视图都可以被子查询替换,但不是所有的子查询都可以用视图替换。
2.2.3 等价谓词重写
数据库执行引擎对一些谓词处理的效率要高于其他谓词,基于这点,把逻辑表达式重写成等价的且效率更高的形式,能有效提高查询执行效率。
常用的谓词重写规则如下:
改写LIKE规则为其他等价的谓词,以更好地利用索引进行优化。
BETWEEN-AND 规则
IN转OR
IN转ANY
OR转ANY
ALL/ANY转换集函数规则
NOT规则
2.2.4 条件简化
把HAVING条件并入WHERE条件
去除表达式中冗余的括号
常量传递
消除死码
表达式计算
等式变换
不等式变换
布尔表达式变换
2.2.5 外连接消除
外连接分为左外连接,右外连接和全外连接。查询重写的一项技术就是把外连接转为内连接,原因如下
查询优化器在处理外连接操作是所需执行的操作和时间多于内连接
优化器在选择表连接顺序时,可以有更多灵活的选择,从而可以选择更好的表连接顺序,加快查询执行的速度。
一些连接算法将数据量较小的表作为外表时,可以减少不必要的IO开销
外连接可消除的条件:WHERE子句中与内表相关的条件满足“空值拒绝”,例如
select
a.id
,
b.id
from a left outer join b on
a.id
=
b.id
where
b.id
is not null
可以重写为下面的inner join
select
a.id
,
b.id
from a inner join b on
a.id
=
b.id
2.2.6 嵌套连接消除
对于一个无嵌套的多表连接,表之间的连接次序是可以交换的,这样能灵活求解不同连接方式的花费,从而得到最小花费的连接方式。
当执行连接的操作次序不是从左到右逐个进行时,就说明这样的连接表达式存在嵌套。
关于嵌套连接的消除规则如下:
当嵌套连接表达式只包括内连接时,括号可以去掉,这意味着表之间的次序可以交换,这是关系代数中连接的交换律的应用
当连接表达式包括外连接时,括号不可以去掉,意味着表之间的次序只能按照原语义进行,至多能执行的就是外连接向内连接转换的优化
2.2.7 连接消除
主外键关系的表进行的连接,可以消除主键表,这不会影响对外键表的查询
唯一键作为连接条件,三表内连接可以去掉中间表(中间表的列只作为连接条件)
2.2.8 语义优化
语义优化的常见方式如下:
连接消除
连接引入
谓词引入
检测空回答集
排序优化
唯一性使用
2.2.9 针对非SPJ的优化
GROUPBY优化
分组操作下移:减少关系元祖的个数
分组操作上移:提高分组操作的效率
ORDERBY优化
排序消除
排序下推
DISTINCT优化
DISTINCT消除
DISTINCT下推
DISTINCT迁移
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Monodyee/article/detail/230455
推荐阅读
article
mysql
中
DATE
_
FORMAT
() 函数详解_
mysql
中的
date
_
format
是什么意思...
其中,
date
参数是要被格式化的日期/时间值,
format
参数是指定的日期/时间格式,可以是一个字符串常量或者包含日...
赞
踩
article
mysql
常用的
数据类型
默认
值
_
mysql
时间类型
值
默认
值
...
DATETIME:
默认
值
'0000-00-00 00:00:00'GEOMETRYCOLLECTION:
默认
值
NU...
赞
踩
article
SQL
优化
15
个技巧...
因为ids太多,即使能快速查出数据,但如果返回的数据量太大了,网络传输也是非常消耗性能的,接口性能始终好不到哪里去。然后...
赞
踩
article
机器
学习
的设计_
机器
学习
课程设计
...
1. 如何构建一个
机器
学习
算法 构建一个
学习
算法的推荐方法为: 1). 从一个简单的能快速实现的算法开始,实现该算法并用...
赞
踩
article
uni
-
app
的初次开启
微信
小
程序
调试
_
uni
-
app
开发
微信
小
程序
如何
debugger
...
uni
-
app
初次使用
微信
小
程序
调试
在开发
uni
-
app
项目过程中,如何开始
微信
小
程序
进行实时编译调试。首先根据官网...
赞
踩
article
dev
board
sig技术文章:轻量
系统
适配
ARM
架构芯片平台_
arm
系统
适配...
_
arm
系统
适配
arm
系统
适配 摘要:本文简单介绍OpenH
arm
ony轻量
系统
移植,会分多篇 ...
赞
踩
article
uni
-
app
(安卓、
微信
小
程序
)
接口
封装
token
失效自动获取新的
token
_
uni
app
微...
接口
封装
token
失效自动获取新的
token
_
uni
app
微信
小
程序
token
uni
app
微信
小
程序
token
...
赞
踩
article
瑞芯微关于RKMEDIA框架的
RKNN
例子解析(二)
_
rknn
_
tensor
_
attr
...
总的来说,就是模型加载后一直循环,取VI的帧数据,这边有点不解,为啥在RGA有能力处理颜色转换的情况下要用软件处理?我想...
赞
踩
article
Mysql
表
逻辑
分区
原理和
应用
...
MySQL的表
逻辑
分区
是一种数据库设计技术,它允许将一个表的数据分布在多个物理
分区
中,但在
逻辑
上仍然表现为一个单一的表。...
赞
踩
article
软件
商店
_
华为
再放大招!发布
华为
电脑
版
应用
商店
:弥补微软Win
系统
不足...
【1月7日讯】相信大家都知道,对于很多手机党用户而言,无论是苹果手机用户,还是安卓手机用户,都几乎喜欢在手机
应用
商店
中下...
赞
踩
article
常见限流
算法
和
go
语言
time
/
rate
go
.
uber
.
org
/
rate
limit讲解...
目录1 背景2 主流限流
算法
2.1 固定/滑动窗口限流
算法
2.1.1 固定窗口限流2.1.2 滑动窗口限流2.2 漏桶算...
赞
踩
article
MySQL
一表中
字段内容是用
逗号
分隔
的
另一表含有对应
数据
的
两表联合
查询
_
sql
分割
逗号
连表
查询
...
MySQL
一表中
字段内容是用
逗号
分隔
的
另一表含有对应
数据
的
两表联合
查询
_
sql
分割
逗号
连表
查询
sql
分割
逗号
连表
查询
...
赞
踩
article
华为
鸿蒙
操作系统
有哪些特点和优势?余承东《
全
场景
时代 新
体验
与新生态》演讲
全
文_
智能化
全
场景
体验
是不...
一、、微内核天然无Root权限,外核服务相互隔离,细粒度权限控制,从源头上提升系统安
全
。二、
鸿蒙
OS实现模块化解耦,对应...
赞
踩
article
python
最全画
地图
,
可视化
数据
...
有时我们会很希望把
数据
展示在
地图
上,来做
数据
可视化
,使
数据
更加清晰明了,可谓一图胜百文。先说说我用
地图
做什么了:微信好友...
赞
踩
article
计算机网络
(
四)...
数据链路层
计算机网络
(
四) 数据链路层 一、数据链路层的大概工作...
赞
踩
article
关于
android
有时候
Edittext
.
setText
无效的解决
方法
,有效_
android
jav...
et_content.
setText
(TAG+“用户可见的时候”);你只要加上控件的post
方法
就可以及时刷新设置的值了...
赞
踩
article
打
造你
的
HTML5
打
地鼠
游戏
:零基础
入门教程
...
在这个教程中,我们将一起学习如何使用HTML、CSS和JavaScript来创建一个简单
的
打
地鼠
游戏
。这不仅是一个有趣
的
...
赞
踩
article
RK3588
-
WIFI
/
BT
调试之
AP6256
_
ap6256
驱动
...
RK3588
-Linux WIF/
BT
AP6256
调试_
ap6256
驱动
ap6256
驱动
...
赞
踩
article
华为
鸿蒙
系统
怎么样
好用吗...
华为官方发布了属于自己的
鸿蒙
系统
,很多的用户都开始纷纷的关注,所以大家都想要知道这个华为
鸿蒙
系统
究竟
怎么样
?是否好用呢?...
赞
踩
article
docker
实现
mysql
主从
搭建-
读写
分离(喂饭)
_
docker
proxysql
...
docker
-
mysql
主从
搭建-
读写
分离
_
docker
proxysql
docker
proxysql
...
赞
踩
相关标签
mysql
数据库
sql
uni-app
微信小程序
小程序
c++
c语言
算法
软件商店
go
分布式
微服务
java
servlet
python
计算机网络
网络
网络协议