cmu15545笔记-查询优化(Query Optimization)
概述
数据库系统的执行流程:

从优化器到磁盘所设计的步骤:

查询优化分为两类:
- Heuristics / Rules:启发式的,基于规则的
- Cost-based Search:基于代价模型。选择代价最小的路径
- Single relation:单表
- Multiple relation:多表。Bottom-Up或Top-Down
- Nested sub-queries:嵌套子查询。重写,分解。
Heuristics / Rules
基本思想:关系代数的等价变换。
谓词下推,投影替代笛卡尔积,投影下推(下图没体现)。

Cost-based Search
查询优化是NP难问题,因此我们无法穷尽所有查询计划,只能选取部分子集,同时无法准确计算代价,只能进行估计:
逻辑代价:谓词选择性,操作符或算法的逻辑复杂度,中间结果大小
物理代价:IO代价,CPU代价,内存使用,数据分布和存储结构
代价的计算来自于统计数据:直方图,快照,采样
搜索方式:Bottom-Top和Top-Down
统计数据 -> 逻辑代价 -> 物理代价 -> 搜索物理代价最小的计划。
结束条件:找到当前所有查询计划中代价最小的一个 或 到达限定时间。
Single relation
对于单表操作来说,简单的启发式优化(Heuristics)+对谓词合理排序往往已经足够了,只需要考虑选择哪种数据库访问方式。
- 全表扫描
- 二分查找(聚簇索引)
- 索引扫描
SELECT *
FROM Employees
WHERE age > 40 AND department = 'IT';
该SQL中,age > 40的选择性为0.1,department = 'IT'为0.9。
- 两个都有索引:分别进行索引扫描过滤,结果取交集。
- 一个有索引(如
age):对age进行索引扫描,得到age>40的数据,再用department = 'IT'对结果进行过滤。 - 都没有索引:全表扫描,用两个条件过滤得到最终结果。
Mutiple relation
Genertive / Bottom-Up
基本思想:通过从最小的数据子集(如单个表或中间结果)开始,逐步合并这些子集,并使用动态规划技术找到整个查询的最优执行计划。
数据库:IBM System R,,DB2,MySQL,Postgres,most open-source DBMSs
例子:IBM System R
- 确定表数据访问方式,列出可能的连接方式

- 搜索最小代价:动态规划+剪枝



Transformation / Top-Down
基本思想:从逻辑查询计划出发,利用分支界限法,逐步转换为物理查询计划,在搜索空间中保留最优方案,同时在规划过程中直接考虑数据的物理属性。
数据库:MSSQL, Greenplum, CockroachDB
存在强制规则(enforer)进行约束,如果不满足就直接剪枝,强制规则可以是一个接受的成本底线,或者是禁用的操作,比如在需要有序结果时却采用Hash Join。

Nested sub-queries
Decomposing Queries
基本思想:嵌套的子查询如果与外部查询无关,分解成一个单独的查询。

Expression/Queries Rewriting
基本思想:对查询或表达式进行同义替换。
SELECT * FROM A WHERE 1 = 0; -> false
SELECT * FROM A WHERE NOW() IS NULL; -> false
SELECT * FROM A WHERE false; -> 不做查询
SELECT * FROM A
WHERE val BETWEEN 1 AND 100
OR val BETWEEN 50 AND 150; -> Where val BETWEEN 1 AND 150
SELECT name FROM sailors AS S
WHERE EXISTS (
SELECT * FROM reserves AS R
WHERE S.sid = R.sid
AND R.day = '2022-10-25'
); ->
SELECT name FROM sailors AS S, reserves AS R
WHERE S.sid = R.sid
AND R.day = '2022-10-25'
Statistics
数据库会在内部的数据目录(Data Catalog)中存储关于表,属性,索引的统计信息(Statistics),不同的系统会在不同的时间更新。
手动调用:
- Postgres/SQLite:ANALYZE
- Oracle/MySQL:ANALYZE TABLE
- SQL Server:UPDATE STATISTICS
- DB2:RUNSTATS
直方图(histogram):等宽直方图;等深直方图


快照(sketch):是一种轻量级的近似统计工具,适合在大数据和实时流场景下使用。
- 相比直方图,能够动态适应数据变化,并显著降低存储和计算成本。
- 在选择性估计中,快照可以有效提高数据库优化的效率,特别是对于高维和动态数据。
采样(sampling):数据规模大时,可以根据样本预估选择性。

cmu15545笔记-查询优化(Query Optimization)的更多相关文章
- CMU Database Systems - Query Optimization
查询优化应该是数据库领域最难的topic 当前查询优化,主要有两种思路, Rules-based,基于先验知识,用if-else把优化逻辑写死 Cost-based,试图去评估各个查询计划的cost, ...
- LIMIT Query Optimization
LIMIT limitFrom , perPageNum LIMIT offset, size MySQL :: MySQL 8.0 Reference Manual :: 13.2.10 SELEC ...
- An Overview of Query Optimization in Relational Systems
An Overview of Query Optimization in Relational Systems
- Database | 浅谈Query Optimization (1)
综述 由于SQL是声明式语言(declarative),用户只告诉了DBMS想要获取什么,但没有指出如何计算.因此,DBMS需要将SQL语句转换成可执行的查询计划(Query Plan).但是对同样的 ...
- SQLite Learning、SQL Query Optimization In Multiple Rule
catalog . SQLite简介 . Sqlite安装 . SQLite Programing . SQLite statements 1. SQLite简介 SQLite是一款轻型的数据库,是遵 ...
- 6-MySQL DBA笔记-查询优化
第6章 查询优化 查询优化是研发人员比较关注也是疑问较多的领域.本章首先为读者介绍常用的优化策略.MySQL的优化器.连接机制,然后介绍各种语句的优化,在阅读本章之前,需要先对EXPLAIN命令,索引 ...
- CSS3学习笔记--media query 响应式布局
语法:@media screen and (min-width: 320px) and (max-width : 479px) media属性后面跟着的是一个 screen 的媒体类型(上面说过的十种 ...
- Adaptive Query Optimization in Oracle Database 12c (12.1 and 12.2)
https://oracle-base.com/articles/12c/adaptive-query-optimization-12cr1
- Database | 浅谈Query Optimization (2)
为什么选择左深连接树 对于n个表的连接,数量为卡特兰数,近似\(4^n\),因此为了减少枚举空间,早期的优化器仅考虑左深连接树,将数量减少为\(n!\) 但为什么是左深连接树,而不是其他样式呢? 如果 ...
- 浅谈MySQL索引背后的数据结构及算法(转载)
转自:http://blogread.cn/it/article/4088?f=wb1 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储 ...
随机推荐
- Gmail 别名
Gmail 有一个很少人知道但是非常实用的功能,那就是别名.Gmail 允许用户通过在基本邮箱地址中添加特定符号和文本来创建多个别名.这些别名都指向同一个 Gmail 账户,方便用户进行邮件管理.过滤 ...
- Docker学习系列3:常用命令之容器命令
本文是Docker学习系列教程中的第三篇.前几篇教程如下: 「图文教程」Windows11下安装Docker Desktop 「填坑」在windows系统下安装Docker Desktop后迁移镜像位 ...
- VC 单文档FormView视图增加打印预览
1修改my.rc文件二处 3 TEXTINCLUDE BEGIN "#define _AFX_NO_OLE_RESOURCES\r\n" "#define _AFX_NO ...
- 【YashanDB知识库】ycm纳管主机安装YCM-AGENT时报错“任务提交失败,无法连接主机”
问题现象 执行安装ycm-agent命令纳管主机时报错 问题的风险及影响 会导致ycm-agent纳管不成功,YCM无法监控主机和数据库 问题影响的版本 yashandb-cloud-manager- ...
- SQL Server – 冷知识 (新手)
前言 没有系统化学一本语言或技术, 那便会被一些冷知识坑. 这里做些记入. 变量作用域 SQL 是远古语法, 声明变量在最顶部就是一条上古法则. 如果我看见有了用这个法则写 C# 或 JS 我就会杀了 ...
- Centos7 阿里云镜像 2207-02 下安装docker-compose后,docker-compose version 命令失效问题
吐槽下,按照官方教程和网上各种教程折腾了很久,最后试出来的. 首先找到docker-compose被安装到那里 whereis docker --输出示例,cd命令进入各自目录查看docker-com ...
- Maven高级——属性
属性 自定义属性 定义属性 <!-- 定义属性--> <properties> <spring.version>5.2.10.RELEASE</spring. ...
- IDEA如何查看每一行代码的提交记录(人员,时间)
前言 我们在使用IDEA开发时,一般需要使用git来管理我们的代码,而且大家协同开发. 有时候,我们在开发的时候,经常需要看一下当前的代码时谁开发的,除了看类上面的作者外,更精细的方式是看每一行代 ...
- CentOS7 控制台上安装运行 vmware workstation 备忘录
目标平台 CentOS 7.5.1804 无桌面,要跑个 Ubuntu.vmx 1.安装依赖库 yum -y install perl gcc kernel-devel libX11 libXiner ...
- 2021年3月国产数据库排行榜:OceanBase勇夺亚军 神舟挺进20强!
1 新春排行 2021年3月榜单新鲜出炉,同2月相比,本月榜单中十强产品还是原来的面孔,其中3款产品取得了新的名次,榜单座次调整超过半数.前三甲仍然是TiDB.OceanBase.达梦. 冠军:TiD ...