数据库系统-数据库查询实现算法

news2024/11/14 14:54:30

文章目录

  • 一、一趟扫描算法
    • 1.1 算法概述
    • 1.2 算法逻辑&物理实现
      • 1.2.1 逻辑层面
      • 1.2.2 物理层面
        • 1.2.2.1 P1
        • 1.2.2.2 P2
        • 1.2.2.3 P3
        • 1.2.2.4 P4
    • 1.3 迭代器构造查询实现算法
    • 1.4 关系操作的一趟扫描算法
    • 1.4 基于索引的查询实现算法
  • 二、两趟扫描算法
    • 2.1 两趟算法基本思想
    • 2.2 多路归并排序算法
    • 2.3 排序的两趟扫描算法
    • 2.4 散列的两趟扫描算法

一、一趟扫描算法

1.1 算法概述

在这里插入图片描述
优化一些操作:把过滤操作推导关联前执行
在这里插入图片描述

1.2 算法逻辑&物理实现

连接操作的实现算法

1.2.1 逻辑层面

在这里插入图片描述
物理层面要比逻辑层面复杂的多

1.2.2 物理层面

在这里插入图片描述
关系是存储在磁盘上的,首先要进行磁盘IO装载进内存

1.2.2.1 P1

在这里插入图片描述

  1. 先读R表的磁盘块循环i
  2. 循环j 读取S的磁盘块
  3. R的第一块,和j的每一块对比

1.2.2.2 P2

在这里插入图片描述
内存中存的下R + S的全部磁盘块
1.都加载到内存中R S
2.R S循环对比

1.2.2.3 P3

在这里插入图片描述
内存中存的下R 的全部磁盘块
S一次一块

1.2.2.4 P4

S >= M,R >= M
如何充分利用内存?

  1. 每次读取子集合有S的M-2块数据
  2. 读取1块R
  3. 生成1块临时RxS的数据
    在这里插入图片描述
    在这里插入图片描述

1.3 迭代器构造查询实现算法

扫描一次数据,全部的关系操作都执行完
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

多个操作合并
在这里插入图片描述

在这里插入图片描述

1.4 关系操作的一趟扫描算法

内存中把全部数据都能装进来
聚簇关系 : 关系中的元祖集中存放(一个块是一个关系中的元祖)

  • TableScan® --表空间扫描算法,扫描结果未排序B®
  • SortTableScan® --扫描结果排序
  • IndexScan® --索引扫描算法
  • SortIndexScan® --扫描结果排序

非聚簇关系:关系中的元祖不一定集中存放(一个块中不一定是一个元祖的)

  • 扫描结果不排序
  • 排序

在这里插入图片描述
在这里插入图片描述

1.4 基于索引的查询实现算法

在这里插入图片描述
在这里插入图片描述

DBMS会根据以下因素来选择使用哪种join物理实现方式:

1. 表大小:如果一个表很小,那么使用嵌套循环(nested loop)join可能比使用其他join方式更快。如果一个表很大,那么使用hash join或sort-merge join等方式更有效率。

2. JOIN条件:如果JOIN条件中包含的参与连接的键是唯一的,那么使用物理实现方式可能是嵌套循环join。如果参与连接的键不是唯一的,那么使用sort-merge join或hash join等方式更合适。

3. 查询复杂度:如果查询复杂度高,那么执行cost-based的优化可能是更合理的方式。例如,优化器可以评估所有可能的join方式,然后选择成本最小的方式。

4. 可用资源:有时候DBMS在可用资源比较有限的情况下(例如内存),无法使用某些join方式。在这种情况下,DBMS必须根据可用资源的限制选择适当的join方式。

5. 磁盘I/O:某些join方式可能会涉及大量的磁盘读写,而其他方式则可能会更少。在考虑使用哪种join方式时,必须考虑磁盘I/O的使用情况。

综上所述,DBMS会根据表大小、JOIN条件、查询复杂度、可用资源和磁盘I/O等因素来选择使用哪种join物理实现方式,以达到最优的性能。

二、两趟扫描算法

一趟算法需要很多内存,为了减少磁盘I/O的次数,提高查询效率。具体原因如下

第一次扫描:在第一次扫描过程中,我们可以筛选出符合条件的部分数据,将它们尽可能地存储在内存中,避免了大量的磁盘I/O操作。这些数据通常被存储在一个中间结果表中。

第二次扫描:在第二次扫描过程中,我们只需要针对中间结果表中的数据进行进一步的处理和筛选,而无需再次访问磁盘中的原始数据表。这就大大减少了磁盘I/O操作的次数,提高了查询效率。

2.1 两趟算法基本思想

对磁盘中的数据划分子集
在这里插入图片描述
在磁盘划分的子集中,再次处理
在这里插入图片描述
在这里插入图片描述

2.2 多路归并排序算法

归并排序算法:
在这里插入图片描述
在这里插入图片描述

算法的效率:读写磁盘的次数:4B®
+ 分解阶段 读一遍 写一遍 2B
+ 归并阶段 读一遍 写一遍 2B

2.3 排序的两趟扫描算法

在这里插入图片描述

2.4 散列的两趟扫描算法

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/467423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Clickhouse分布式表引擎(Distributed)写入核心原理解析

Clickhouse分布式表引擎(Distributed)写入核心原理解析 Clickhouse分布式表引擎(Distributed)写入核心原理解析Clickhouse分布式表引擎(Distributed)查询核心原理解析 Distributed表引擎是分布式表的代名…

vue打包并部署到nginx上

一、打包vue项目 打包的命令依据项目的配置可能会有所不同,打包的命令可以在package.json中查看 项目中vue.config.js中的配置如下: proxy关系到我们项目部署到nginx上需要配置对应的反向代理 publicPath关系到我们部署时是否需要配置子路径 默认情况…

基于公共信箱的全量消息实现

作者 | 百度消息中台团队 导读 消息中台为百度App以及厂内百度系产品提供即时通讯的能力,提供包括私聊、群聊、聊天室、直播弹幕等用户沟通场景,并帮助业务通过消息推送触达用户。百度App存在需要以『低用户打扰』的形式触达全量用户的场景,而…

AcWing第 96 场周赛

竞赛 - AcWing 一、完美数 4876. 完美数 - AcWing题库 1、题目 如果一个正整数能够被 2520 整除,则称该数为完美数。 给定一个正整数 n,请你计算 [1,n]范围内有多少个完美数。 输入格式 一个整数 n。 输出格式 一个整数,表示 [1,n] 范…

C++:Article : 链接器(三):库与可执行文件的生成

链接器:库与可执行文件 1. 静态库1.1 静态链接下,可执行文件如何生成 2. 动态库2.1 动态库特点以及与静态库使用方式差异2.2 动态库和静态库使用时间 3. load-time dynamic linking(加载时动态链接)3.1:阶段一&#xf…

【工具】FFmpeg|超大视频本地有损压缩,500MB变25MB(支持 Windows、Linux、macOS)

参考: 如何将一分钟长的1080p视频压缩至5MB以内?-知乎-滔滔清风近期HEVC扩展备用安装方法-B站-悲剧天下 总共三个步骤,安装FFmpeg、运行指令、打开视频。 亲测 500MB 变 25MB。 1 安装FFmpeg 对于不需要看教程可以自行完成安装的同学们&am…

MySQL基础案例——数据表的基本操作:创建表和修改表

目录 案例目的: 创建表: 创建offices: 创建employees表: 修改表: 将 employees 的 mobile 字段移动到 officeCode 字段后: 将 birth 字段名称改为 employee_birth: 修改 sex 字段,数据类…

TryHackMe-Looking Glass(boot2root)

Looking Glass 穿过镜子。仙境挑战室的续集。 端口扫描 循例nmap 又是一堆ssh,跟之前的玩法一样 找到正确的ssh端口之后后给了一段密文,要求输入secret才能进入ssh 这看起来非常像凯撒密码 唯一可识别的信息是Jabberwocky,我们找到了它 它…

IDA简单使用

今天来简单介绍一下逆向中常用到的另一个静态分析工具IDA,还是昨天那个打印demo(64位): #include #include char a[] "https://www.vultop.com/"; int main(int argc, char* argv[]) { printf("%s", a)…

什么是微服务

目录 一、微服务介绍 1. 什么是微服务 2. 微服务由来 3. 为什么需要微服务? 3.1 最期的单体架构带来的问题 3.2 微服务与单体架构区别 3.3 微服务与SOA区别 4. 微服务本质 5. 什么样的项目适合微服务 6. 微服务折分与设计 6.1 微服务设计原则 7. 微服务…

linux gcc + openocd + stlink + cubeMX + cortex Debug

文章目录 运行环境:1.1 gcc1)下载并解压gcc2)环境配置 2.1 openocd1)下载并解压openocd2)环境配置(没有权限就加sudo) 3.1 stlink1)下载并双击安装stlink 4.1 cubeMX1)下载并解压cubeMX2)生成makefile工程 5.1 cortex Debug1)setting设置2)la…

冷链物流运转 3D 可视化监控,助力大数据实时监控

智慧物流是以信息化为依托并广泛应用物联网、人工智能、大数据、云计算等技术工具,在物流价值链上的 6 项基本环节(运输、仓储、包装、装卸搬运、流通加工、配送)实现系统感知和数据采集的现代综合智能型物流系统。随着冷链信息化、数字化发展…

史上最全! 瑞芯微RK3568核心板评估板资源分享!

▎瑞芯微RK3568芯片 高性能处理器:采用四核A55架构CPU,G52 GPU;内置NPU,可提供1T算力 高可靠性设计:支持DDR及CPU Cache全链路ECC 内置自研ISP图像处理器:8M30fps处理能力,强大的HDR功能&#…

Springboot Netty 实现自定义协议

Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架&…

《编程思维与实践》1039.字符组合

《编程思维与实践》1039.字符组合 题目 思路 先将字符串去重排序(保证每个组合中的字符按字典序),然后枚举出所有组合的情形,最后再进行字典序排序即可. 其中字符串的去重排序可以利用ASCII码值进行桶排序,关键在于如何枚举所有组合的情形. 每个位置有两种可能(选或不选),但至…

MongoDB 聚合管道的输出结果到集合($out)及合并结果到集合($merge)

上一篇文章,我们介绍了使用聚合管道完成文档之间的关联查询、以及如果将两个管道中的文档进行合并,如果需要进一步了解可以参考:MongoDB 聚合管道的文档关联查询($lookup)及管道合并($unionWith)https://blog.csdn.net/m1729339749/article/d…

ES索引管理

ES官方博客:https://elasticstack.blog.csdn.net/?typeblog 一、rolloverAPI https://elasticstack.blog.csdn.net/article/details/102728987 1.1 rollover命令 POST /log_alias/_rollover { "conditions":{ "max_age":"…

Node 09 MongoDB的使用

MongoDB 简介 Mongodb 是什么 MongoDB 是一个基于分布式文件存储的数据库,官方地址 https://www.mongodb.com/ 数据库是什么 数据库(DataBase)是按照数据结构来组织、存储和管理数据的 应用程序 数据库的作用 数据库的主要作用就是 管理…

jsp家庭农场投入品信息管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 jsp家庭农场投入品信息管理系统是一套完善的java web信息管理系统 serlvet dao bean 开发,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发…

如何理解PCB布线3W规则

我们平时在PCB布线的时候,对于比较重要的信号都要做特殊处理,比如包地或者时“3W”,所谓3w指的是线与线之间的间距要满足三倍的线宽,那么我们怎么理解这个3W原则呢,他是如何降低信号之间的串扰的呢? 我们要…