概述

数据库系统的执行流程:

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


查询优化分为两类:

  1. Heuristics / Rules:启发式的,基于规则的
  2. Cost-based Search:基于代价模型。选择代价最小的路径
    1. Single relation:单表
    2. Multiple relation:多表。Bottom-Up或Top-Down
    3. 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

  1. 确定表数据访问方式,列出可能的连接方式

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


![image-20241119145258994](/Users/iven/Library/Application Support/typora-user-images/image-20241119145258994.png)

Transformation / Top-Down

基本思想:从逻辑查询计划出发,利用分支界限法,逐步转换为物理查询计划,在搜索空间中保留最优方案,同时在规划过程中直接考虑数据的物理属性。

数据库:MSSQL, Greenplum, CockroachDB

存在强制规则(enforer)进行约束,如果不满足就直接剪枝,强制规则可以是一个接受的成本底线,或者是禁用的操作,比如在需要有序结果时却采用Hash Join。

Nested sub-queries

Decomposing Queries

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

![image-20241119150608999](/Users/iven/Library/Application Support/typora-user-images/image-20241119150608999.png)

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)的更多相关文章

  1. CMU Database Systems - Query Optimization

    查询优化应该是数据库领域最难的topic 当前查询优化,主要有两种思路, Rules-based,基于先验知识,用if-else把优化逻辑写死 Cost-based,试图去评估各个查询计划的cost, ...

  2. LIMIT Query Optimization

    LIMIT limitFrom , perPageNum LIMIT offset, size MySQL :: MySQL 8.0 Reference Manual :: 13.2.10 SELEC ...

  3. An Overview of Query Optimization in Relational Systems

    An Overview of Query Optimization in Relational Systems

  4. Database | 浅谈Query Optimization (1)

    综述 由于SQL是声明式语言(declarative),用户只告诉了DBMS想要获取什么,但没有指出如何计算.因此,DBMS需要将SQL语句转换成可执行的查询计划(Query Plan).但是对同样的 ...

  5. SQLite Learning、SQL Query Optimization In Multiple Rule

    catalog . SQLite简介 . Sqlite安装 . SQLite Programing . SQLite statements 1. SQLite简介 SQLite是一款轻型的数据库,是遵 ...

  6. 6-MySQL DBA笔记-查询优化

    第6章 查询优化 查询优化是研发人员比较关注也是疑问较多的领域.本章首先为读者介绍常用的优化策略.MySQL的优化器.连接机制,然后介绍各种语句的优化,在阅读本章之前,需要先对EXPLAIN命令,索引 ...

  7. CSS3学习笔记--media query 响应式布局

    语法:@media screen and (min-width: 320px) and (max-width : 479px) media属性后面跟着的是一个 screen 的媒体类型(上面说过的十种 ...

  8. Adaptive Query Optimization in Oracle Database 12c (12.1 and 12.2)

    https://oracle-base.com/articles/12c/adaptive-query-optimization-12cr1

  9. Database | 浅谈Query Optimization (2)

    为什么选择左深连接树 对于n个表的连接,数量为卡特兰数,近似\(4^n\),因此为了减少枚举空间,早期的优化器仅考虑左深连接树,将数量减少为\(n!\) 但为什么是左深连接树,而不是其他样式呢? 如果 ...

  10. 浅谈MySQL索引背后的数据结构及算法(转载)

    转自:http://blogread.cn/it/article/4088?f=wb1 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储 ...

随机推荐

  1. 【GitHub】上传代码通用操作等(附下载单个文件夹或文件)

    一.创建GitHub账号以及配置 参考我的另一篇文章:<[Mac系统 + Git]之上传项目代码到github上以及删除某个文件夹> 二.创建新的个人知识库 前面配置完之后,下面讲的再新建 ...

  2. 关于java连接数据库时提示异常java.sql.SQLException: No suitable driver found for说明

    当我们测试一个新的数据库服务时,需要使用对方提供jdbc驱动来连接数据库,有时候简单的写个demo去连接,发现提示异常: java.sql.SQLException: No suitable driv ...

  3. 微信小程序之无需服务端支持实现内容安全检查

    微信小程序之无需服务端支持实现内容安全检查 微信小程序审核未通过,原因如下: 为避免您的小程序被滥用,请你完善内容审核机制,如调用小程序内容安全API,或使用其他技术.人工审核手段,过滤色情.违法等有 ...

  4. “java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/LoopTag”解决方法

    在运行jsp项目的时候出现了这个java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/LoopTag报错,一直尝试更换jar文件等也没 ...

  5. WPF性能优化之UI虚拟化

    @ 目录 前言 一.VirtualizingStackPanel 1.1 虚拟化功能介绍 1.在Window中添加一个ListBox控件. 2.在设计视图中用鼠标选中ListBox控件并右健依次单击& ...

  6. ICMAN触摸滑条滚轮方案

    ICMAN触摸滑条滚轮调光是一种利用触摸技术实现的调光控制方式,是一种更简单.直观且节能的调光方式,有效改善了用户的照明体验,并在智能家居和节能照明领域发挥着重要作用. 基于厦门晶尊微电子(ICMAN ...

  7. manim边学边做--空心多边形

    空心的多边形Cutout是一种比较特殊的多边形,主要用于解决与形状.大小.位置等相关的数学问题. Cutout多边形可以定义物体表面的空洞或凹陷部分,从而更准确地模拟现实世界中的复杂形状. 比如,在P ...

  8. 暑假集训CSP提高模拟 ∫[0,6] (x^2)/6 dx

    \[\text{暑假集训CSP提高模拟}\int^{6}_{0}\frac{x^{2}}{6}dx \] 关于这个东西怎么求的良心教程 含义:求出 \(f(x)=\frac{x^{2}}{6}\) 在 ...

  9. C# WebSocket Servers -- Fleck、SuperSocket、TouchSocke

    最近在维护老项目,感觉内存一直都有问题,定位到问题是WebSocketServer的问题,了解了 Fleck.SuperSocket.TouchSocke 等开源项目,这里记录一下. .net5..n ...

  10. 《WebGL 编程指南》读书笔记(2、3章)

    完整 demo 和 lib 文件可以在 https://github.com/tengge1/webgl-guide-code 中找到. 第 2 章 第一个 WebGL 程序 function mai ...