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.pswp.cn/news/386755.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386755.shtml
英文地址,請注明出處:http://en.pswp.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 …