(十四--十五)数据库查询优化Part I
(十四--十五)数据库查询优化Part I
如果理解的有问题。欢迎大家指出。这也是我在看课记得笔记。。可能会有很多问题
查询优化的重要性
- 请记住用户只会告诉DMBS他们想要什么样的结果,而不会告诉他们如何获得结果
- 不同的查询plan性能上会有非常大的差距。[比如之前的nested join 和 index join]
1. Heuristics / Rules策略
这一策略侧重于重构那些愚蠢的sql语句
注意这里的Logical Plan
和Physical Plan
是不同的
- 在第一个阶段我们会重写SQL语句。这里更多的是利用一些启发式的思维,比如列裁剪(过滤掉查询不需要使用到的列)、谓词下推(将过滤尽可能地下沉到数据源端)、常量累加(比如 1 + 2 这种事先计算好) 以及常量替换(比如
SELECT * FROM table WHERE i = 5 AND j = i + 3
可以转换成SELECT * FROM table WHERE i = 5 AND j = 8
)等等。 - 后面会把引用格式转换成内部的标识符,然后构建语法树。至此我们的逻辑计划就大致构建完成。️一个逻辑计划会对应许多的物理计划。
- 最后
Optimizer
的作用就是选择代价最小的物理计划。根据代价,将确定从逻辑计划到物理计划的选择
这里需要一点关系代数的只是。但是cmu数据库重点并不是放在这个上面。所以附上一个链接大家看看就好
1.1 重写sql的优化-->谓词PushDown
这里用几个ppt里的例子看一下。这个操作对于查询的优化
左右两个语法树最后产生的结果完全一致。但是性能上确大相径庭。
左边是整个Student
表和右边的enrolled
表做join操作。然后再做select
操作。但是如果在enrolled
表中只有几条元素满足grade==A
。这样我们把昨天的sql重写成右边的sql就会让整体的性能提高许多。
从语法树上看我们把select grade =='A'
这个谓词向下push了。所以这种优化也叫谓词push down。
1.2 重写sql的优化 --> PROJECTION PUSHDOWN
我们先进行投影操作。就可以减少遍历tuple的大小。对于速度和内存上都是不小的优化
同样我们可以直接删掉那些不可能或不必要的谓词
对于下面的我们就可以直接忽略谓词
对于下面的操作我们可以合并谓词
2. COST EMSTIMATION 优化
为了估计花销而引入的一些变量
\(N_R\) : Number of tuples in R.
\(V(A,R)\): Number of distinct values for attribute A.
\(SC(A,R)\) :selection cardinality is the average number of records with a value for an attribute A given \(\frac{N_R}{V(A,R)}\)
2.1 SELECTION STATISTICS
这里假设了所有的数据都符合均匀分布
看下面的例子。这个关系中有5个tuple。年龄分别为0~4。那么假设数据符合均匀分布。年龄为2的人在里面就占了百分之20.
再看下面对于范围谓词的例子
这里其实很好理解。就是看A所在的范围在整个数据范围占的比例
对于neg谓词
一些复杂的谓词
这里和概率论里的容斥原理基本类似
- 对于交运算
- 对于或运算
2.2 SELECTION CARDINALITY
显然数据不可能完全符合均匀分布。这里具体看一下不同分布的数据如何进行
对于数据不均衡的分布。
- 我们对数据进行分桶。随后统计每个桶内元素的个数
- 我们更改桶的范围。来尽量使每个桶内的元素个数相同
2.3 Sample
这里的sample就和深度学习里的sample一个意思。
比如对于这个例子。我们在有一亿个tuple的表中随机sample出来三个tuple。以此来代表整个表中tuple的情况。当然这样是不准确的。但是作为一个简单的先学知识是完全可以的。
3. 应用动态规划的优化
从下面这个例子开始
可以看见在第二步奔向第三步的时候,我们有了不同的选择。这里的Hash Join
和sortMerge Join
有了不同的花费。显然我们应该 选择花费更小的路径。
这里回到第一步我们应该选择一条花费更小的路径。由于200 + 300 < 300 + 300 。因此我们应该选择下面这条。
4. 候选plan的选择
由于一条逻辑plan会对应许多的物理plan
那么如何选择一个最好的plan。请看下面的步骤
- 首先列举出来所有的candidate plan
- 立即去掉所有带corss-product操作的plan
- 用不同的join算法替代join操作。这样就可以列出所有的情况
NLJ = nested Loop Join
HJ = hash join
显然我们可以从里面选择最好的。也就是两个join操作都基于HJ
- 在替代所有的访问算法
5. POSTGRES OPTIMIZER
这种优化方法主要针对于语法树的重构。每次都淘汰一种花费最多的方案。对于其他的方案都给机会。
这里300花费最多。所以直接淘汰
然后对于剩下的两种情况。把所有语法树重构的情况列举出来
6.Others
DBMS将where子句中的嵌套子查询视为获取参数并返回单个值或一组值的函数。
有下面一些简单的方法对于子查询的优化
Rewrite
对于下面这个nested的子查询
我们可以把这个sql语句重写
DECOMpose Query
对于下面这个例子
我们可以先执行对于标记为红色框框的select语句。并且我们知道这条语句整个sql执行过程中都不会发生变化。我们先把他执行完成。并将结果传递到这里。这样就可以省略超级多的sql查询。类比下面的c++代码
for (int i = 0; i < a.size(); ++i) {
xxxxx
}
// 对于上面的代码我们可以做出下面的优化
int size_ = a.size();
for (int i = 0; i < size_; ++i) {
xxxxx
}
//这是因为在整个for语句执行过程中这个size都不会发生变化。如果采取上面的写法,那我们会执行n次a.size()操作。这是非常浪费时间的
(十四--十五)数据库查询优化Part I的更多相关文章
- abp(net core)+easyui+efcore实现仓储管理系统——入库管理之十(四十六)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- python3笔记二十四:Mysql数据库操作命令
一:学习内容 Mysql操作命令:启动服务.停止服务.连接数据库.退出数据库.查看版本.显示当前时间.远程连接 数据库操作命令:创建数据库.删除数据库.切换数据库.查看当前选择的数据库 表操作命令:查 ...
- 二十四、MongoDB数据库的使用
首先按照上一篇文章的介绍,启动并连接数据库 然后我们开始学习如何使用MongoDB数据库: 1.创建数据库 第一步,在cmd窗口执行: use dbname dbname是你打算要创建的数据库名称 执 ...
- Python之路【第二十四篇】:数据库索引
数据库索引 一.索引简介 索引在mysql中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈 ...
- 第二百七十四、五、六天 how can I 坚持
三天小长假这么快就过去了,好快啊.基本都是在济南过的. 元旦.坐车回济南.下午在万科新里程看了一下午房子,没有买啊,93的现在八千六七,有点贵啊,户型也不是自己喜欢的. 晚上一块吃了个饭,还行,晚上在 ...
- 第二百四十四、五天 how can I 坚持
昨天忘了.不知咋忘的,加班加迷糊了? 昨天联调接口,又加班了,好歹基本调通了. 今天,下午,开会,有点被领导批的意思,不是批我,是批我们团队. 团队. 不懂自己. 这样做有意义嘛. 睡觉.好烦. 到底 ...
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之一(四十九)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- abp(net core)+easyui+efcore实现仓储管理系统——入库管理之十二(四十八)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- 孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档
孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数据库 ...
随机推荐
- 你所不知道的 JS: null , undefined, NaN, true==1=="1",false==0=="",null== undefined
1 1 1 === 全相等(全部相等) == 值相等(部分相等) demo: var x=0; undefined var y=false; undefined if(x===y){ console ...
- React Hooks: useState All In One
React Hooks: useState All In One useState import React, { useState } from 'react'; function Example( ...
- HTML5 Canvas in Action
HTML5 Canvas in Action canvas 图片处理 视频编辑工具 xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- Angular Routing
Angular Routing v9.0.7 https://angular.io/start/start-routing
- Python算法_盛最多水的容器(04)
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...
- RabbitMQ之TTL(Time-To-Live 过期时间)
本文转载自RabbitMQ之TTL(Time-To-Live 过期时间) 概述 RabbitMQ可以对消息和队列设置TTL. 目前有两种方法可以设置.第一种方法是通过队列属性设置,队列中所有消息都有相 ...
- HTTP/1.1报文详解
本文为<三万长文50+趣图带你领悟web编程的内功心法>第三个章节. 3.HTTP/1.1报文详解 在RFC2616中心详细的描述了HTTP/1.1[1]的报文,感兴趣的朋友也可以前往阅读 ...
- KnowRbao_uni-app
uni-app开发项目模板 主要的代码如下: pages.json 这里是添加页面的路径代码还可以设置标题: { "pages" : [ //pages数组中第一项表示应用启动页, ...
- SpringBoot整合MyBatis-Plus框架(代码生成器)
MyBatis-Plus的简介 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 代码生成器 通用的CU ...
- 将VMware工作站最小化到托盘栏
目录 前言 将VMware最小化到托盘栏的方法 1.下载 Trayconizer 2.解压 trayconizerw.zip 3.创建 VMware 快捷方式 4.修改 VMware 快捷方式 5.运 ...