CMU Database Systems - Sorting,Aggregation,Join

Sorting

排序如果可在内存里面排,用经典的排序算法就ok,比如快排

问题在于,数据表中的的数据是很多的,没法一下都放到内存里面进行排序

所以就需要用到,外排,多路并归排序

看下最简单的,2路并归排序,

设文件分为N个page,memory中一次最多可以放入B个pages

所以在sort过程,一次性可以载入B个page,在内存中page内排序,写回disk,称为一轮,run
那么如果一共N个page,需要N/B+1个run

在merge过程,如果双路并归排序,只需要用到3个page的buffer,多了也没用

Merge过程的cost

每个pass都需要读写一遍所有的数据,cost为2N
2 way,所以一共有1 + logN个pass

多路并归排序的通用公式如下,

其他都比较容易理解,为什么way数是B-1?

因为memory一共B个buffer,需要留一个output,剩下的用于merge,所以最多是B-1路并归排序

 

如果我们有B+ index的情况下,

分两种情况,要排序的字段有Clustered B+索引,那么直接从左到右遍历叶子节点就好

排序的字段不是Clustered B+索引,比如是secondary 索引

那么从索引里面只能获取到排好序的id,然后要通过id去Clustered B+索引中取真正的value,效率也很低,每个record都需要一次io

 

Aggregation

Aggregation有两种思路,

一种先排序sorting,然后再按顺序做aggregate

这个方法明显的问题,就是比较费,有些场景不需要sort,比如group by,distinct

所以第二种思路是Hashing,

在memory里面临时维护一个hash table,去重或聚合都在hash table上完成

问题就是,如果hash table太大,内存放不下怎么办?

所以解法的思路,放不下,就切开,切成能放下的一个个partition,并且要保证一个key的数据都在一个partition里面,这样只要保证内存能够放下一个partition就可以aggregate,不需要去读其他的partition

第一次partition划分成几个partition,如果内存B个buffer,划分成B-1个partition;如果划分完了某个partition还是放不下怎么办,那就继续划分,直到所有partition都可以放到内存中

这里有几个问题,

首先,一个partition应该不止一个key,如果只有一个,第二步里面的h2感觉没用
第二,假设数据是均匀分布的,不会出现太大的倾斜,不会有partition overflow

 

Join

为什么需要join?

因为不同的数据存在不同的表里面,所以要查询就需要关联
那么为什么不能放在一张表里面,关系表的设计有范式的要求,避免大量的数据重复

 

Join Operator Output

直接输出data,这样好处是,后续operator不用回到数据表再去读数据
这个方法比较实用于TP需求,结果数据较少的情况

仅仅输出ids,适合AP需求,join结果集非常大的情况

尤其适用于列存,因为这样你只需要读出join id列,也不浪费

然后在最后要显示的时候,才去把需要的数据从表里面查出来,这叫做late materialization

这样的好处,过程中可能还有其他的join,过滤等,所以开始读可能浪费,到最后真正需要的时候再读

 

Join Cost

如何去评价join算法的好坏,就是要评价cost

传统的数据库的瓶颈在disk IO,所以这里就以磁盘IO的次数来评价join算法的好坏,这个和为何使用B+tree作为index的理由一样
所以就是读写page的个数

 

Join算法 

Nested Loop Join

Simple,直觉的方式就是遍历两个表
这里的概念,分为Outer和Inner表
从Cost上看,最要取决于Outer的tuples数,所以如果把较小的表N作为Outer会效率高些  

比较明显的问题是,没有必要读那么多遍的inner表

如果我能把outer表直接放在内存中,那么只需要读一遍inner就可以了,如果不行就用如下的block的方式

如果内存大小是B,那么要用两块来放inner和output,所以可以用B-2来放outer

Cost,outer表M需要读一次,inner表需要读M/(B-2)次

这里也写了,如果memory比较大,那么cost就是M+N,只需要读一遍inner

 

如果有index,是否可以加快join的效率?应该可以,但是效果要看是什么index,如果hash,C=O(1),B+tree,C=O(logn)

 

Sort-Merge Join 

这个方法要求,两个表先排序,然后做一轮幷归就可以完成join
所以这个方法适用于,两个表本身就有序,或是在join key上有index
这个方法附带的好处是结果有序

这个算法的Cost,主要是两个表排序的cost,幷归的cost就是M+N

 

Hash Join

HashJoin分为两步,两步的hash函数用同一个

Build,对较小的表建临时的hash table

Probe,读取另一张表,进行join

这有个类似的问题,Hash Table里面存什么?

当然可以直接存join的结果,也可以存tuple id,这个选择就取决于场景

 

自然有个疑问,如果内存放不下这个hash table怎么办?

既然放不下,就需要分而治之,两个表用相同的hash函数,hash到相同数目的buckets里面去

在内存中,一次只读一组bucket来进行join,是不是很ok

 

 那么如果hash成bucket的时候,不均衡,一个bucket也overflow,怎么办?答案是继续分

 

Grace Hash Join的cost

 

 所有join算法的Cost对比,

 

 

转载于:https://www.cnblogs.com/fxjwind/p/10906161.html

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

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

相关文章

springboot线程池的使用和扩展

实战环境 windowns10;jdk1.8;springboot 1.5.9.RELEASE;开发工具:IntelliJ IDEA; 实战源码 本次实战的源码可以在我的GitHub下载,地址:gitgithub.com:zq2599/blog_demos.git,项目主…

统计单词个数

我是抄题解狂魔 /* 1.s.substr(x,len) 在s中取出从x位置开始,长度为len的字符串,并返回string类型的字符串。 2.s.find(a) 在s中查找字符串a,并返回起始下标(从0开始),若不存在,返回1844674407370955161&am…

通过Rancher安装K8s

说明 我们用kubernetes去管理Docker集群,即可以将Docker看成Kubernetes内部使用的低级别组件。另外,kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。希望我这篇文章中简单的描述能让你对两者有所理解和认识。 机…

35. 搜索插入位置-LeetCode

心得:这个题也是二分查找,但是有个小技巧:当left>right的时候 left就是要插入的位置。 代码: 1 class Solution {2 public int searchInsert(int[] nums, int target) {3 if(numsnull||nums.length0)4 …

Kubectl指令集

1 Kubectl指令集 1.1 Master查询节点信息 [rootmaster1 kubernetes-1.10]# kubectl get nodes 1.2 查询所有Pod信息 [rootmaster1 ~]# kubectl get pods --namespacekube-system 1.3 查询故障的Pod信息 [rootmaster1 ~]# kubectl get pods -n kube-sys…

SQL基础培训实战教程[全套]

学习简介:林枫山根据网上搜索资料进行参考,编写制作的SQL Server实操学习教程,欢迎下载学习。 下载链接目录如下: 进度0-SQL基础语法 下载学习文档 进度1-建数据表-美化版-2018-6-12 下载学习文档 进度2-关于主键-美化…

K8S仪表板Service unavailable故障的解决办法

K8S仪表板Service unavailable故障的解决办法 (使用Rancher部署Kubernetes后访问仪表板提示Service unavailable的问题) 一、逐项检查: 1、操作系统Kernel版本(3.10以上) 2、检查OS版本(Ubuntu16.04.x、…

实验五报告

一、实验结论&#xff1a; 1. 二分查找&#xff1a;补足程序ex1_1.cpp// 练习&#xff1a;使用二分查找&#xff0c;在一组有序元素中查找数据项 // 形参是数组&#xff0c;实参是数组名 #include <stdio.h> const int N5; int binarySearch(int x[], int n, int item…

关于浏览器内核

介绍一下对浏览器内核的理解主要分成两个部分&#xff1a;渲染引擎(Render Engine)和JS引擎。常见的浏览器内核有哪些&#xff1f;Trident内核&#xff1a;IE&#xff0c;360&#xff0c;搜过浏览器&#xff1b;Gecko内核&#xff1a;Netscape6及以上版本&#xff0c;Presto内核…

docker 全部杀掉

杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器 docker rm $(docker ps -a -q) 删除所有未打 dangling 标签的镜像 docker rmi $(docker images -q -f danglingtrue) 删除所有镜像 docker rmi $(docker images -q) 强制删除镜像名称中包含“do…

实验五 网络编程与安全-----实验报告

一、实验五 网络编程与安全-1 1.实验要求&#xff1a; 两人一组结对编程&#xff1a; &#xff08;1&#xff09;参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA &#xff1b; &#xff08;2&#xff09;结对实现中缀表达式转后缀表达式的功能 MyBC.java&#xff1b…

K8S的HelloWorld之旅

安装kubectl。使用Google提供商&#xff08;如Google Container Engine或Amazon Web Services&#xff09;创建Kubernetes群集。本教程创建一个 外部负载均衡器&#xff0c;它需要一个云提供商。配置kubectl与Kubernetes API服务器通信。有关说明&#xff0c;请参阅云提供商的文…

思维构造——cf1090D

/* 只要找到两个没有关系的点即可 */ #include<bits/stdc.h> using namespace std; #define maxn 100005 long long n,m; int a[maxn],b[maxn]; vector<int>G[maxn]; int main(){cin>>n>>m;if(n1){puts("NO");return 0;}if(n*(n-1)/2<m)…

误删docker0网桥之后怎么办呢?

误删docker0网桥之后怎么办呢&#xff1f; 今天&#xff0c;在搭建k8s node节点环境的时候&#xff0c;好巧不巧&#xff0c;执行了如下命令&#xff1a; 1 2 [roothxin221 ~]# ifconfig docker0 down &>/dev/null [roothxin221 ~]# brctl delbr docker0 &>/de…

boost.asio学习

https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming-chinese/content/Chapter1.html转载于:https://www.cnblogs.com/hshy/p/10930398.html

Harbor:私有企业级Registry仓库--快速搭建

前言 Harbor可以通过Docker Composer的方式来部署&#xff0c;如果有正常运行的k8s环境&#xff0c;也可以使用k8s来部署Harbor&#xff0c;本文采用 Docker Composer的方式。 准备 假定Linux系统为Centos 7。 docker &#xff0c;默认安装即可 yum -y install docker 1 dock…

java-Mysql学生管理系统

Window1//主方法 package stu_zizhu1; import java.awt.Button; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JBu…

Docker版本Jenkins的使用

Docker版本Jenkins的使用 低调的微胖关注赞赏支持 Docker版本Jenkins的使用 12018.05.15 18:21:50字数 1202阅读 22588 一. 什么是Jenkins Jenkins是当前非常流行的一款持续集成工具&#xff0c;可以帮助大家把更新后的代码自动部署到服务器上运行。 二. 为什么用docker版…

小程序 setData 中的坑,其实好像...

最近这段时间在写微信小程序&#xff0c;有一个页面需要动态修改 data 中的数据&#xff0c;而这里似乎是个坑。 1、正常修改 正常修改很简单&#xff0c;当触发 change 事件时&#xff0c;数据和页面都会同时发生改变。这个也不用多说&#xff0c;很简单的例子。 2、如何修改对…

CentOS HarBor安装与配置

HarBor 安装与配置 Prerequisites for the target host ResourceCapacityDescriptionCPUminimal 2 CPU4 CPU is preferredMemminimal 4GB8GB is preferredDiskminimal 40GB160GB is preferred 环境 centos7harbor v1.6.3python v2.7及以上docker v1.10及以上docker-compose …