基于三级存储器的 Join 算法

合集下载

三级存储系统中一种高效的连接算法

三级存储系统中一种高效的连接算法

计算机研究与发展ISSN 100021239P CN 1121777P TPJournal of Computer Research and Development 44(1):105~110,2007收稿日期:2005-08-03;修回日期:2006-05-09基金项目:国家自然科学基金项目(60273082);国家/八六三0高技术研究发展计划基金项目(2002AA444110);国家/九七三0重点基础研究发展规划基金项目(G1999032704);黑龙江省自然科学基金项目(zj g03205)三级存储系统中一种高效的连接算法刘宝良 李建中 高 宏(哈尔滨工业大学计算机科学与技术学院 哈尔滨 150001)(liubl@hit 1edu 1cn)An Efficient Join Algorithm for Data on Tertiary StorageLiu Baoliang,Li Jianzhong,and Gao Hong(School of Computer Science and Technology,Har bin I nstitute o f Techno logy,Har bin 150001)Abstract The online use of tertiary storage system provides a costly and feasible scheme for massive data management 1In order to extend database system to manage data on tertiary storage,the relational opera 2tors,especially the join operation,are one of the key problems that must be resolved 1An efficient tertiary join algorithm is presented 1Experimental results show that the join algorithm is better than previous ones in performance and scalability 1The join algorithm can greatly reduce the I P O cost compared with previous ones 1When the data amount is huge,the performance of the join algorithm is even better than that of disk join 1T he result of the paper shows that tertiary storage can be used to manage massive data as well as disks,solving the key problem of storing and querying massive data 1Key wor ds join algorithm;tertiary storage system;attribute separation;join result index摘 要第3级存储器的联机使用为海量数据管理提供了一种廉价可行的方案1为了使数据库管理系统能够联机使用第3级存储设备,第3级存储设备上的关系操作算法,特别是连接操作算法是必须解决的关键问题之一1提出一种高效的连接算法1实验结果表明,该算法无论在性能方面还是在扩展性方面都优于以往算法,极大地减少了I P O 代价1当数据量较大时,算法的性能不低于基于磁盘的连接算法1结果表明,第3级存储器可以像磁盘一样在海量数据库系统中联机使用,解决海量数据库存储和联机查询等关键问题1关键词连接算法;3级存储系统;属性划分;连接结果索引中图法分类号 TP311113磁盘价格的下降及存储容量的增长始终不能满足飞速增长的海量数据存储需求[122]1由主存、磁盘及联机使用的第3级存储设备(如机械手磁带库等)构成的3级存储系统为海量数据的存储提供了廉价、可扩展的硬件解决方案[324]1目前的数据库系统都是基于2级存储设备(主存、磁盘)的,无法有效管理第3级存储设备上的数据1当需要处理第3级存储设备上的数据时,需先将数据复制到磁盘,然后使用基于磁盘的数据库技术进行处理1显然这种方式无法直接管理数据量高于磁盘容量的海量数据[526]1因此,需要研究适用于3级存储系统的数据操作算法,特别是最常用也最耗时的连接算法1本文目的就是研究适用于第3级存储设备(以机械手磁带库为例)的海量数据连接算法1以往的连接算法通常具有数据的多遍扫描问题与冗余I P O 问题1为了避免第3级存储器过高的定位代价,以往算法在对数据进行预处理(比如散列)时,通常需要多遍扫描原始关系数据1冗余I P O 问题源于关系数据的存储方式1磁盘和磁带都是块访问设备1关系数据按照元组存储,即使仅访问关系中某一元组的某一属性,也需要读取包含该元组的整个数据块1I P O代价是影响连接操作性能的主要因素,由于磁带是慢速访问设备,更应该避免冗余I P O问题1本文提出了一种高效的连接算法ASJ(attribute separating join)1ASJ算法能够有效地避免以上问题1当数据量较大时,算法的性能不低于基于磁盘的连接算法1表1列出了文中用到的参数:Ta ble1The P arameter s Used in This P aper表1本文用到的参数Parameters Description|R|Size of relation R(the same with S,M,D,J R and J S)+R+Cadinality of R(the same with S,J R and J S)J R Join attribute relation of R(the same with S)A R Non2joi n attri bute relation of R(the same with S)c(R)Reducing ratio of R(the s ame wi th S)J RI Join result i ndexR C Sem i join relation of RX D Data transfer rate of diskX T Data transfer rate of tape driverK Th e ratio of S size to R size1相关工作许多数据库工作者在基于3级存储系统的海量数据连接算法方面开展了一些研究工作[729]1这些工作可以分为两类:嵌套循环(nested loop)连接和散列(hash based)连接1循环嵌套连接算法是一种低效的连接算法,它循环读取内关系并将内关系与外关系进行连接1针对嵌套循环连接的低效问题,散列连接为内关系及外关系构造散列桶,同时将散列值相同的内、外关系的散列桶进行连接1散列连接能够有效地减少I P O代价1针对第3级存储器的最有效的连接算法是CTT2GH[8]算法1它的执行过程分为两个阶段:第1阶段是划分阶段,采用相同的方法划分关系R及S,并要求R的每个划分R i可以完整地装入内存;第2阶段是探测阶段,依次将R i装入内存,并探测对应的S i,形成连接结果12基于属性划分的连接算法211连接属性划分阶段设R(rj,a1,,,a m)和S(sj,b1,,,b n)是两个关系,其中{a1,,,a m}和{b1,,,b n}分别是R和S 的非连接属性集合,rj和sj是连接属性1连接属性划分阶段将关系R及S进行连接属性划分1对关系R进行属性划分的结果为J R(r id,sj)及A R(r id,a1,,,a m)1其中,r id是在属性划分的过程中,由系统自动添加的自增长的整数,它能够惟一标识R中的元组1由于J R中包含连接属性,称其为连接属性关系1A R中不包含连接属性,称其为非连接属性关系1212连接阶段连接阶段有两个步骤:在步骤1中划分关系J R为多个子关系,要求每个子关系可以完整地装入主存1在步骤2中将关系J S读入磁盘缓冲空间,并同时用相同的划分函数对J S进行划分,当磁盘缓冲区满时,将磁盘中数据与关系R进行连接1这个过程直到关系J S扫描完1连接阶段输出的结果为两个连接属性关系的元组标识符对,即(r id,sid)1由于其可以作为两个非连接属性关系的连接索引[10],我们称其为连接结果索引1下面是连接阶段算法的形式化描述:算法11JoinPhase1输入:连接属性关系J R与J S1输出:连接结果索引JRI1¹FOR i=1TO|J R|P|D|DOº在磁盘中形成|D|P|M|个关系J R的子关系;»将这些子关系写入磁带;P*每个划分在磁带中存储位置连续*P¼END FOR½WH ILE J S未读完DO(并行地执行¾,¿~Â步)¾将J S的一部分J S i+1读入磁盘D,并按照与步骤º相同的方式散列;¿将前一次读入的J S i与J R进行连接;得到连接结果JRI写入内存缓冲区ÀIF内存缓冲区满TH ENÁ将JRI按照sid排序后,写入磁盘缓冲区;106计算机研究与发展2007,44(1)ÂEND IFl v END WH ILE213物化阶段物化阶段利用连接结果索引JRI,归并两个非连接属性关系A R及A S1下面是物化阶段算法的形式化描述:算法21Materialization1输入:非连接属性关系A R,A S及连接结果索引JRI1输出:最终连接结果1¹按照sid多路归并排序JRI;ºWHILE(not end JRI)DO»IF磁盘缓冲区D满TH EN¼按rid多路归并R C;½归并R C与A R,并输出连接结果;¾END IF¿用r id替换A S元组中的sid;À将归并结果写入内存缓冲区M;ÁIF内存缓冲区M满TH ENÂ对M中的元组按照r id排序,并写回磁盘;l v END IFl w END WH ILE214ASJ算法的正确性证明ASJ算法在物化阶段中,JRI分别与A S及A R做归并,归并的结果是否正确完全依赖于JRI 的元组是否与连接结果元组一一对应1下面的定理保证这种一一对应关系1定理11设R与S是两个关系,J R与J S分别为其对应的连接属性关系,J RI为J R与J S的连接结果索引,C为R与S的连接结果,则JRI中的元组与C的元组间存在一一对应关系1证明1略1215对ASJ算法的优化在连接属性划分阶段,可以根据统计信息,预先估算连接属性关系J R及J S的大小,分情况将他们保存到磁盘或磁带中,从而对基本ASJ算法进行优化11)J R与J S可同时保存到磁盘缓冲区在这种情况下,连接属性划分阶段将J R与J S直接写入磁盘,采用磁盘连接算法进行连接,生成连接结果索引1其中,写入磁盘操作代价与扫描关系R及S的代价重叠,因此写入磁盘代价可以忽略1显然在磁盘上进行连接操作比在磁带上进行连接操作快得多12)J R与J S之一可保存到磁盘缓冲区在这种情况中,连接属性划分阶段将可以保存在磁盘中的关系(假设为J R)直接写入磁盘1J R 与J S的连接转变为磁盘2磁带连接1优化的连接阶段算法同样分为两个步骤:步骤1划分J R,此时对J R的划分不需要多遍扫描,可以极大地节省磁带I P O1步骤2将J S读入缓冲区,并用相同的划分函数对J S进行划分1当缓冲区满时,将缓冲区中数据与J R进行连接1步骤2执行到J S读完为止1要根据磁盘剩余空间与内存空间的大小情况来决定采用磁盘剩余空间作缓冲区,还是采用内存做缓冲区1 216性能分析CTT2G H算法是第3级存储设备上性能最好的海量数据连接算法1当下面条件满足时ASJ算法性能优于CTT2G H算法1定理21设K=|S|P|R|(|S|>|R|)为关系S 与关系R的大小的比值,c=min{c(R),c(S)}为缩减比的最小值1则当满足条件c\1+K时,ASJ 算法的性能优于CTT2G H算法的性能1证明1略13实验结果本文在PentiumÓ计算机上实现了ASJ算法1计算机的CPU主频为PentiumÓ550MHz,操作系统为Linux712,内存为128MB,20GB磁盘空间1计算机通过一个INITIO SCSI22总线连接Exabyte 220L磁带库1磁带库具有两个Eliant820磁带驱动器,磁带容量为10GB(未压缩),磁带架上可以放20盘磁带1磁带库的详细性能参数参见表11在所有的实验中,设定关系R和S的大小满足|S|=2|R|,元组数满足+S+=2+R+,缩减比满足c(R)=c(S)1R的连接属性值惟一,S的连接属性参照R的连接属性,但S的连接属性随机生成1这样,连接结果索引JRI的势在没有其他过滤条件的情况下为+S+1除非特别说明,我们在实验中设定的主存容量为40MB,磁盘容量为650MB1 311数据集大小对ASJ算法和CTT2GH算法性能的影响第1组实验比较ASJ算法和CTT2GH算法的性能随数据集变化的情况1在这组实验中,数据集从3GB增长到30GB(关系R从1GB增长到10GB)1 c(R)=c(S)=10,+J RI+=011+S+1在图1中107刘宝良等:三级存储系统中一种高效的连接算法列出了两种算法的执行时间,显然ASJ 算法的执行时间大大优于CTT 2GH 算法1从图中可以看到,即使两个连接属性关系都不能保存到磁盘中(即|R |>6GB 时),ASJ 算法的性能仍然比CTT 2GH 好得多1比较ASJ 与CTT 2G H 的性能随数据量增长的变化情况,可以清楚地看出ASJ 算法执行时间随数据集的增长比CTT 2GH 算法慢得多,说明ASJ 算法的扩展性极大地优于CTT 2GH 算法1Fig 11 The influence of dataset size on performance 1图1 数据集大小对算法性能的影响图2中给出了连接阶段的执行时间占ASJ 算法总的执行时间的比例1在所有情况下,连接阶段占ASJ 算法总的执行时间不到2%1通过图1及图2可以得出结论:ASJ 可以有效地避免冗余I P O 的问题,并能够极大地减少关系的扫描遍数,极大地提高连接算法的执行效率及改善连接算法的扩展性1Fig 12 The ratio of join phase 1图2 连接阶段占总执行时间比例312 缩减比对性能的影响在第2组实验中,使用30GB(|R |=10GB)的测试数据集1+J RI +=011+S +1我们固定连接属性的大小,通过增大关系R 及S 的元组大小的方法来增大缩减比,为了保持数据集合大小不变,我们相应地减少元组数目1由于CPU 代价可以忽略不计,所以执行时间的减少肯定不是由于元组数目的下降所致1实验结果如图3所示1从图中可以看出,算法的执行时间随着缩减比的提高而降低1缩减比越大两个连接属性关系就越有可能放入磁盘,进而提高连接的执行时间1当增大缩减比时,算法的执行时间趋向于收敛到一个定值1该值即第3级存储设备上进行连接操作的最小I P O 代价1Fig 13 The influence of reducing ratio on performance 1图3 缩减比对性能的影响313 JRI 的势对ASJ 性能的影响第3组实验选用30GB(|R |=10GB)的测试数据集1c (R )=c (S)=101实验结果如图4所示1JRI 的势越高物化阶段生成的临时关系R C 越大,R C 很可能不能放在磁盘缓冲区中,从而在与A R 归并时,需要多遍扫描A R 1实验中关系S 的大小为20GB,即使J RI 的势为011+S +时,物化阶段的临时关系R C 也不能完全存放在磁盘缓冲区,从而需要多边扫描A R 1但是即使这样,ASJ 算法的性能也要大大优于CTT 2GH 算法1从图4中可以看到,即使J RI 的势等于+S +时,ASJ 算法的执行时间只有CTT 2G H 算法的一半左右1Fig 14 T he influence of |JRI |on t he performance 1图4 J RI 的势对算法性能的影响314 ASJ 算法与3种磁盘连接算法的比较为了充分说明第3级存储设备管理海量数据的有效性,我们分别实现了磁盘中的3种连接算法,它108计算机研究与发展 2007,44(1)们分别是嵌套循环连接、排序归并连接及散列连接,并将这些连接算法与ASJ 算法进行性能对比1在实验中固定内存大小为40MB 1在前3种算法中,设定磁盘空间足够大1ASJ 算法的磁盘缓冲空间为1GB 1实验数据集大小从3GB 变化到30GB(其中关系R 从1GB 变化到10GB),c (R)=c (S)=101+JRI +=011+S +1实验结果如图5所示1在4种算法中,嵌套循环连接的性能最差,排序归并连接与散列连接的性能相近,并且散列连接的性能稍稍优于排序归并连接1当数据量超过18GB(|R |>6GB)时,ASJ 算法的性能优于其他3种磁盘连接算法1为了更清楚地说明ASJ 算法性能优越的原因,我们将4种算法的执行时间与扫描一遍数据集的时间进行对比,结果如图6所示1从图中可以看到,嵌套循环连接扫描数据集的遍数远远高出其他3种算法,排序归并连接及散列连接都需要对数据集进行多遍扫描,且它们扫描数据集的遍数相近,但都高于ASJ 算法1这个实验还进一步表明,对于海量数据连接操作来说,选用高性能的算法比选用的更高级的设备的收益更大1Fig 16 The ratio of execution time to the times of scan 2ning dataset 1图6 算法执行时间与扫描数据集时间的比值Fig 15 Performance comparison between ASJ and disk joins 1图5 ASJ 算法与磁盘连接算法的性能比较315 磁带传输速度对算法性能的影响不同厂商磁带库系统的数据传速率差别很大1在以上实验中都是采用慢速的磁带库设备,这必然使实验结果向有利于磁盘算法的方向偏斜1在下面的仿真实验中,我们测试磁带传输率对ASJ 算法性能的影响1实验数据集为30GB(|R |=10GB),c(R)=c(S)=10,+J RI +=011+S +1我们用磁盘来模拟磁带库设备,并通过插入冗余数据的方法来改变数据传输率1实验结果如图7所示1从图中可见,磁带数据传速率对ASJ 算法性能影响很大1当磁带数据传输率为磁盘数据传输率的1P 10时,ASJ 算法性能不如排序归并算法及散列算法,当提高磁带数据传输率为磁盘数据传输率的3P 10时,ASJ 算法开始优于磁盘算法1目前带光线通道的高端磁带库磁带驱动器的数据传输率为70MB P s,而个人计算机上的磁盘传输率仅为10MB P s 左右1在高端磁带库设备上运行ASJ 算法会比磁盘上的连接算法效率更高1这又进一步说明了采用第3级存储设备管理海量数据的可行性及有效性1F ig 17 The influence of tert iar y data transfer rate on thejoin performance 1图7 磁带的传输速度对算法性能的影响4 结 论针对传统连接算法的多遍关系扫描问题及冗余I P O 问题,本文提出了基于属性划分的ASJ 连接算法1理论分析及实验表明,ASJ 算法可以极大地降低影响连接算法性能的主要因素)))I P O 代价1并且随着数据量的增长,ASJ 算法具有很好的扩展性,说明ASJ 算法比以往的磁带连接算法更适用于对海量数据的处理1本文还通过大量的实验说明了采用第3级存储器管理海量数据的可行性及有效性,并说明在海量数据管理中,算法的选择对性能的影响比采用的设备对性能的影响大得多1并且在高端109刘宝良等:三级存储系统中一种高效的连接算法磁带库设备上运行ASJ算法的性能甚至比磁盘连接算法的效率更高1因此我们的结论是,3级存储器辅以有效的数据处理算法是解决海量数据存储和管理的有效途径1参考文献[1]L B Michael,B Adam,R H James,et al1Data managementchallenges i n very large enterprises[C]1In:Proc of the28thInt.l Conf on Very Large Data B ases1San Fran cisco:MorganKaufmann,2002[2]M J C arey,L M H aas,M Livny1T apes hold data,too:Chanl2lenges of tuples on tertiary store[C]1Associati on for C omputi ngMachinery Special Interest Group on Management of Data,Washington,1993[3]S Sarawagi1Database systems for efficient access to tertiarymemory[C]1IEEE Symp on Mass Storage Systems,M on2terey,C A,1995[4]S Sarawagi1Query processing in terti ary memory databases[C]1The21th Conf on Very Large Databases,Zurich,Switzerland,1995[5]J Yu,D De Wi tt1Processi ng satelli te images on tertiary stor2age:A study of the impact of tile size on performance[C]1T he5th National Aeronautics and Space Admi n i stration GoddardConf on Mass Storage Systems and Technologies,College Park,MD,1996[6]D De Witt,J Yu1Query pre2execution and batching i n Par2adis e:A two2pronged approach to the efficient processing ofqueries in tape2resident data sets[C]1The9th Int.l Conf onScientific and Statis tical Database Management,Olympia,Washington,1997[7]J Myllymak i,M Livny1Disk2tape joins:Synchron i zing disk andtape access[C]1ACM SIGMETRICS,Lausanne,Switzerland,1996[8]J Myllymaki,M Livny1Relati onal j oins for data on terti ary s tor2age[C]1Int.l Conf on Data Engineering,Bi rmingham,UK,1997[9]Kraiss,P Muth,M Gillmann1T ape2disk strategies under diskcontention[C]1Int.l Conf on Data Engineering,Birmingham,Australia,1999[10]P Valduriez1Join indices[J]1ACM T rans on Database System,1987,12(2):218-246Liu Baoliang,born in19761P h1D1Hismain resear ch inter ests are query processingtechniques for massive data1刘宝良,1976年生,博士,主要研究方向为海量数据的查询处理技术1Li J ianzhong,bor n in19501P rofessor andPh1D1super visor1Senior member of ChinaComputer Federation1His main resear ch in2ter ests ar e database,parallel,etc1李建中,1950年生,教授,博士生导师,中国计算机学会高级会员,主要研究方向为数据库、并行计算等1Gao Hong,born in19661P rofessor and P h1D1supervisor1Senior member of ChinaComputer Federation1Her main research in2ter ests ar e database,data warehouse system,etc1高宏,1966年生,教授,博士生导师,中国计算机学会高级会员,主要研究方向为数据库、数据仓库等1Resear ch Backgr oundThe management of DBMS on tertiar y storage is becoming more and mor e important with the development of applications,not only because tertiary devices have been used to archive data,but also the amount of data that application had to deal with is increasing r apidly1D espite the decrease in secondary storage prices,the data storage requirements of these applications cannot be met economi2 cally using secondar y storage alone1Ter tiary storage offers a lower2cost alter native1But till now,commer cial database systems are op2 timized for performance with pr imar y and secondary storage1Ter tiary storage,if included in the syst em,serves only as a backup medium or slow store from which data is first moved onto disks and then the D BMS operates on it as though it wer e disk resident da2 ta1Ter tiary devices differ significantly fr om magnetic disks,in particular1T hey ar e not random access devices and media switch times are several orders of magnitude higher1Due to these differences,optimizations that wor k well for magnetic disks can result in disas2 trous performance on tertiar y storage1So we need to study data operation methods required by tertiar y storage system,especially the join method1The purpose of this paper is to study the join method for massive data on tertiary stor age system1 110计算机研究与发展2007,44(1)。

一种改进的闪存数据库Sort-Merge-Join算法

一种改进的闪存数据库Sort-Merge-Join算法
d i1 .9 9 ji n 10 . 6 5 2 1 .2 0 6 o:0 3 6 / . s. 0 13 9 .0 2 0 .5 s
I r v d S r・ re- i lo i m o a h me r aa a e s se mp o e o tMeg -on ag r h frf s moy d tb s y tms - J t l
邢玉钢 王翰 虎 ,马 , 。 丹 陈 , 梅
( . 州大学 计 算机 科 学与信 息 学院 , 阳 50 2 ; . 州星辰 科技 开发 有 限公 司 , 阳 500 ) 1贵 贵 505 2 贵 贵 50 1

要 :在 对传 统的 SrM r — i 法进 一 步研 究的 基础 上 , 出 了一 种 改进 的 闪存 数 据 库 SrM r — i ot e e o - g J n算 提 o — e eJ n t g o
Ke o d :f s a b s ; ot eg — i lo tm; u r rc s;pi v la o ; ono eai y w r s l hd t ae S r M reJ nag rh q eyp oe s r e eau t n ji p rt n a a — o i c i o
算 法。该 算 法只对 小 关 系进行 外排 序 , 避免 了大关 系的 外排 序 , 节省 了大 量 时 间 , 同时最 小化 了中 间临 时表 , 达
到 了 少写 闪存 、 小擦 除代 价的 目的 。通过 理论 分析 和 与传统 Sr Meg.on算 法在 闪存 上 的 比较 实验 , 明 了 减 o — reJi t 证 该算 法的优 越性 。
t a i e ain, S a e o ftm e Att a i e,i a hiv d t r s fls it a h m e r n r d c n h h tbg r l to O s v d a lto i . hes metm t c e e hepu po eo e swr e f s moy a d e u i g te l c s fe a i g,S hi lo ih i ov d t u r f ce c o to r sn O t s ag rt m mpr e he q e y e i n y. An e p rme twih t e c mpa io fa ta iin lag rt m i x e i n t h o rs n o r d to a l o ih pr v he s pe irt ft i lo ih . o est u ro iy o h sag rtm

join算法分析

join算法分析

join算法分析对于单条语句,explain看下key,加个索引多个条件,加复合索引where a = ? order by b 加(a,b)的复合索引上⾯都是⽐较基本的,这篇我们分析⼀些复杂的情况——join的算法如下两张表做join10w 100wtb R tb Sr1 s1r2 s2r3 s3... ...rN sNⅠ、nested_loop join1.1、simple nested_loop join 这个在数据库中永远不会使⽤For each row r in R doFor each row s in S doIf r and s satisfy the join conditionThen output the tuple <r,s>扫描成本 O(Rn*Sn),也就是笛卡⼉积1.2、index nested_loop join 最推荐For each row r in R dolookup in S indexif found s == rowThen output the tuple<r,s>扫描成本 O(Rn)优化器倾向于使⽤⼩表做驱动表,内表上创建索引即可select * from a,b where a.x=b.ya中的每条记录,去b上⾯的index(y)中去找这个x的记录,a表和b表,哪个是R,哪个是SR:驱动表(外表) S:内表对于inner join,a b 和 b a join出来结果⼀样,⽤的索引来查询,100w和1000w扫描成本都⼀样,都是外表的⾏数,所以只要驱动表越⼩,优化器就倾向于⽤它做驱动表对于left join,左表要全表扫描所有记录,所以⼀定是驱动表⽐如,⼀列10w⾏,另⼀列100w⾏,优化器会喜欢把10w的这⼀列做外表,然后在100w的列上建索引,外表只要扫描10w次,假设100w记录索引B+ tree⾼度是3,那⼀共就是10w * 3次io操作,反过来,就是100w * 3次,所以,mysql只要两张表关联,⾮常建议两张表上⼀定要有索引,索引应该创建在S表上,也就是⼤表,如果索引加反了,这时候100w的表就成了驱动表但是线上肯定不会直接两张表关联,where后⾯还有很多过滤条件,优化器会把这些条件考虑进去,过滤掉这些条件,看哪张表⽰⼩表就是驱动表,但是索引有倾斜,优化器在选择上可能会出错1.3 block nested_loop join 两张表上没有索引的时候才会使⽤的算法⽤来优化simle nested_loop join,减少内部表的扫描次数For each tuple r in R dostore used columns as p from R in join bufferFor each tuple s in S doif p and s satisfy the join conditionThen output the tuple <p,s>加⼀个内存,join_buffer_size变量,空间换时间,这个变量决定了Join Buffer的⼤⼩Join Buffer可被⽤于联接是ALL,index,range的类型Join Buffer只存储需要进⾏查询操作的相关列数据(要关联的列),⽽不是整⾏的记录(千万要记住),所以总的来说还是蛮⾼效的,扫描成本呢?和simple⼀样Table R join buffer Table S将多条R中的记录⼀下⼦放到join buffer中,join buffer ⼀次性和Table S中每条记录进⾏⽐较,这样来减少内表的扫描次数,假设join buffer⾜够⼤,⼤到能把驱动表中所有记录cache起来,那这样就只要扫⼀次内表举例:A B1 12 23 34外内SNLP BNLP外表扫描次数 1 1内表扫描次数 3 1⽐较次数 12 12综上:⽐较次数是节省不下来的如果是百万级别,mysql勉强可以跑出来结果,调优的话,不谈索引,我们就要调⼤join_buffer_size这个参数,默认256k,如果这个列是8个字节,256k显然存不下太多记录,这个参数可以调很⼤,但是不要过分了,不然机器内存不够,数据库挂了就不好了,⼀般来说1g最⼤了join_buffer_size是私有的,每个线程可以⽤的内存⼤⼩⽹上有个特别错误的观点,mysql加速join查询,加⼤join_buffer_size。

join顺序算法

join顺序算法

在计算机科学中,JOIN顺序算法是一种用于排序的方法,特别适用于多关键码排序。

该算法按照从最主位关键码到最次位关键码或从最次位到最主位关键码的顺序逐次排序,主要分为两种方法:最高位优先(Most Significant Digit first)法,简称MSD法,和最低位优先(Least Significant Digit first)法,简称LSD法。

MSD法首先按k1排序分组,将序列分成若干子序列,同一组序列的记录中,关键码k1相等。

然后对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。

最后将各组连接起来,便得到一个有序序列。

例如在扑克牌的排序中,先按照花色进行排序,然后按照面值进行排序,这就使用了MSD法。

LSD法则是先从kd开始排序,再对kd-1进行排序,依次重复,直到按k1排序分组分成最小的子序列后。

最后将各个子序列连接起来,便可得到一个有序的序列。

例如在扑克牌的排序中,先按照面值进行排序,然后按照花色进行排序,这就使用了LSD法。

这两种方法的选择取决于具体的应用场景和需求。

MSD法可以保证在每个子序列中,较小的元素都位于较大的元素之前,因此在合并时可以更快地产生有序的序列。

而LSD法在每个子序列中保留了最大的元素,因此在某些情况下可能更有利于处理大量数据。

JOIN顺序算法的时间复杂度主要取决于分解和合并这两个步骤。

在理想情况下,分解的时间复杂度为O(n log n),其中n是记录的数量。

合并的时间复杂度为O(n),因为每个记录只需要比较一次。

然而,在实际应用中,由于数据的不规则性和复杂性,时间复杂度可能会增加。

因此,选择合适的分解和合并策略对于优化JOIN顺序算法的性能至关重要。

JOIN顺序算法的空间复杂度主要取决于所使用的数据结构和算法实现。

一般来说,如果使用递归或动态规划等需要大量额外空间的数据结构或算法实现,空间复杂度可能会增加。

MySQL的joinbuffer原理及如何提高查询效率

MySQL的joinbuffer原理及如何提高查询效率

MySQL的joinbuffer原理及如何提⾼查询效率⼀、MySQL的join buffer在MySQL对于join操作的处理过程中,join buffer是⼀个重要的概念,也是MySQL对于table join的⼀个重要的优化⼿段。

虽然这个概念实现并不复杂,但是这个是实现MySQL join连接优化的⼀个重要⽅法,在"暴⼒"连接的时候可以极⼤提⾼join查询的效率。

关于这个概念的权威说明当然是来⾃MySQL⽂档中对于这个概念的,说明的⽂字不多,但是⾔简意赅,说明了这个优化的主要实现思想:Assume you have the following join:Table name Typet1 ranget2 reft3 ALLThe join is then done as follows:- While rows in t1 matching range- Read through all rows in t2 according to reference key- Store used fields from t1, t2 in cache- If cache is full- Read through all rows in t3- Compare t3 row against all t1, t2 combinations in cache- If row satisfies join condition, send it to client- Empty cache- Read through all rows in t3- Compare t3 row against all stored t1, t2 combinations in cache- If row satisfies join condition, send it to client⼆、join buffer cache存储空间的分配下⾯函数中table_count表⽰的就是所有join table中在该table之前的⾮const table数量,因为这个table要缓存⾃⼰之前所有table中的每条记录中"需读取"(tables[i].table->read_set置位)。

三种Join方法

三种Join方法

三种Join⽅法NESTED LOOP JOIN (NLJOIN)对于被连接的数据⼦集较⼩的情况,nested loop连接是个较好的选择。

nested loop就是扫描⼀个表,每读到⼀条记录,就根据索引去另⼀个表⾥⾯查找,没有索引⼀般就不会是 nested loops。

⼀般在nested loop中,驱动表满⾜条件结果集不⼤,被驱动表的连接字段要有索引,这样就⾛nstedloop。

如果驱动表返回记录太多,就不适合nested loops了。

如果连接字段没有索引,则适合⾛hash join,因为不需要索引。

Inner table被Outer table驱动,outer table返回的每⼀⾏都要在inner table中检索到与之匹配的⾏。

Outer table: ⼩表、驱动表Inner table: 被驱动表、⼤表(可⽤ordered提⽰来改变CBO默认的驱动表,可⽤USE_NL(table_name1 table_name2)提⽰来强制使⽤nested loop。

)HASH JOIN (HSJOIN)Hash join是CBO 做⼤数据集连接时的常⽤⽅式。

优化器扫描⼩表(或数据源),利⽤连接键(也就是根据连接字段计算hash 值)在内存中建⽴hash表,然后扫描⼤表,每读到⼀条记录就来探测hash表⼀次,找出与hash表匹配的⾏。

当⼩表可以全部放⼊内存中,其成本接近全表扫描两个表的成本之和。

如果表很⼤不能完全放⼊内存,这时优化器会将它分割成若⼲不同的分区,不能放⼊内存的部分就把该分区写⼊磁盘的临时段,此时要有较⼤的临时段从⽽尽量提⾼I/O 的性能。

临时段中的分区都需要换进内存做hash join。

这时候成本接近于全表扫描⼩表+分区数*全表扫描⼤表的代价和。

⾄于两个表都进⾏分区,其好处是可以使⽤parallel query,就是多个进程同时对不同的分区进⾏join,然后再合并。

但是复杂。

使⽤hash join时,HASH_AREA_SIZE初始化参数必须⾜够的⼤,如果是9i,Oracle建议使⽤SQL⼯作区⾃动管理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET即可。

mysql join 用法解析

mysql join 用法解析

mysql join 用法解析MySQL是一种广泛使用的关系型数据库管理系统,它可以进行多种类型的查询和操作。

在MySQL中,JOIN是一种非常重要的操作,它允许将多个表进行连接,从而实现更复杂的查询和分析。

在本文中,我们将详细解析MySQL JOIN的用法,包括不同类型的JOIN和它们之间的区别,以及如何正确使用JOIN来优化查询性能。

一、什么是JOIN在数据库中,通常会有多个表存储不同的数据。

JOIN操作可以将这些表连接在一起,从而实现数据的统一查询和分析。

简单来说,JOIN操作是通过共享列值将两个或多个表组合在一起。

在MySQL中,JOIN操作使用SELECT语句来执行,可以通过使用JOIN关键字或逗号来指定连接条件。

JOIN操作的基本语法如下:SELECT 列1, 列2, ... FROM 表1 JOIN 表2 ON 表1.列= 表2.列在上述语法中,JOIN关键字用来连接两个或多个表,而ON关键字用于指定表之间的连接条件。

二、不同类型的JOINMySQL支持多种类型的JOIN操作,包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。

下面我们逐个解析这些JOIN 的特点和用法。

1. INNER JOININNER JOIN是最常见的JOIN类型,它返回两个表中满足连接条件的匹配行。

如果某行在一个表中有匹配的行,在另一个表中没有匹配的行,则不会返回这些行。

INNER JOIN通常使用如下的语法:SELECT 列1, 列2, ... FROM 表1 INNER JOIN 表2 ON 表1.列= 表2.列2. LEFT JOINLEFT JOIN返回左边表中的所有行,以及右边表中与左边表匹配的行。

如果右边表中没有匹配的行,则返回NULL。

LEFT JOIN的语法如下:SELECT 列1, 列2, ... FROM 表1 LEFT JOIN 表2 ON 表1.列= 表2.列3. RIGHT JOINRIGHT JOIN与LEFT JOIN相反,它返回右边表中的所有行,以及左边表中与右边表匹配的行。

mysql join查询索引原理

mysql join查询索引原理

MySQL Join查询索引原理详解1. 引言在使用MySQL数据库进行查询操作时,经常会使用到JOIN语句,它能够将多个表中的数据进行关联,从而得到更丰富的查询结果。

然而,JOIN操作可能会导致性能问题,特别是当表的数据量很大时。

为了提高查询性能,我们可以使用索引。

索引是一种数据结构,能够快速找到满足特定条件的数据。

本文将详细解释与MySQL Join查询索引原理相关的基本原理。

2. 索引简介索引是一种有序的数据结构,它可以加快数据的查找速度。

在MySQL中,索引是通过B树或者哈希表实现的。

B树是一种平衡的多路搜索树,它能够保持数据有序并且支持快速的插入、删除和查找操作。

哈希表则是通过哈希函数将关键字映射到存储位置的数据结构,它能够以常数时间进行插入、删除和查找操作。

MySQL中的索引分为主键索引、唯一索引、普通索引和全文索引等类型。

主键索引是表中的一列或者多列,它的值唯一标识一条记录。

唯一索引是表中的一列或者多列,它的值不允许重复。

普通索引是表中的一列或者多列,它的值可以重复。

全文索引是对表中的文本列进行索引,它能够快速地进行全文搜索。

3. JOIN查询的原理JOIN查询是通过将多个表的数据进行关联,从而得到更丰富的查询结果。

在MySQL 中,JOIN查询可以分为内连接、外连接和交叉连接等类型。

3.1 内连接内连接是通过两个或者多个表中的共有列进行关联,并且只返回满足关联条件的记录。

内连接可以使用JOIN关键字或者逗号来表示。

例如,下面的SQL语句使用内连接查询了两个表的数据:SELECT *FROM table1JOIN table2ON table1.column = table2.column;内连接的原理是根据JOIN条件对两个表进行匹配。

在执行内连接查询时,MySQL会先对表进行笛卡尔积操作,然后根据JOIN条件进行筛选,最后返回满足条件的记录。

3.2 外连接外连接是通过两个或者多个表中的共有列进行关联,并且返回满足关联条件的记录以及没有关联的记录。

mysql中join 用法

mysql中join 用法

mysql中join 用法MySQL中的JOIN语法是用于将两个或多个相关的表连接起来,以便在一个查询中检索相关联的数据。

JOIN操作可用于联接表,将其组合,并组合它们的行来创建一个完整的结果集,也就是展示出查询结果的所有列,而不是单独查询各自的表。

本文将以中括号为主题,解释MySQL中使用JOIN的语法、类型以及实例,帮助读者更好地理解JOIN操作。

一、JOIN操作的语法MySQL中JOIN操作的语法如下所示:SELECT [column_list] FROM table1 JOIN table2 ON [join_condition];其中,column_list表示要选择的列,table1和table2表示要连接的两个表,join_condition表示连接的条件,可以是单个或多个表中的列等值条件。

二、JOIN类型MySQL中JOIN操作有多种类型,可以根据需求选择不同类型的JOIN来实现。

下面列出了MySQL中的常见JOIN类型:1. INNER JOININNER JOIN操作基于某种关联条件将两个表中的行匹配,并且仅返回两个表中都存在的行。

另外,此操作也称为等值连接或自然连接,并且是MySQL中默认的连接类型。

INNER JOIN语句的示例:SELECT a.id, , b.salary FROM employees a INNER JOIN salaries b ON a.emp_no = b.emp_no;这个查询语句将从两个表中选择id、name和salary列,并通过连接条件'emp_no'将两个表合并起来进行匹配。

2. LEFT JOINLEFT JOIN操作基于某种关联条件将两个表中的行匹配,并且返回左表中的所有行,而只返回右表中与左表中的行匹配的行。

LEFT JOIN语句的示例:SELECT a.id, , b.salary FROM employees a LEFT JOIN salaries b ON a.emp_no = b.emp_no;这条查询语句将从employees和salaries表中选择各自的id、name、salary 列,并基于连接条件'emp_no'连接这些列。

数据库join语句用法

数据库join语句用法

数据库join语句用法
JOIN语句用于将两个或多个表中的行连接在一起,基于它们之间的相关列。

它可以用来检索相关表之间的数据,以及将数据从一个表复制到另一个表。

JOIN语句的基本语法如下:
```
SELECT列名称
FROM表1
JOIN表2 ON表1.列=表2.列
```
这里的表1和表2是要连接的两个表的名称,ON子句用于指定连接条件,列是连接两个表的相同列或相关列的列名称。

JOIN语句有多种类型,包括内部联接(INNER JOIN)、左外部联接(LEFT JOIN)、右外部联接(RIGHT JOIN)和全外部联接(FULL
OUTER JOIN)等。

这些联接类型之间的区别在于处理不匹配的记录时的方式。

-内部联接(INNER JOIN):只返回满足连接条件的记录。

-左外部联接(LEFT JOIN):返回左边表中的所有记录和右边表中满足连接条件的记录。

-右外部联接(RIGHT JOIN):返回右边表中的所有记录和左边表中满足连接条件的记录。

-全外部联接(FULL OUTER JOIN):返回左边表和右边表中的所有记录。

JOIN语句可以通过添加多个表来连接更多的表,并且可以使用多个连接条件来进一步筛选结果。

除了JOIN语句之外,还有一些其他类型的连接操作符,如CROSS JOIN、SELF JOIN等,它们可以用来执行更复杂的连接操作。

需要注意的是,在使用JOIN语句时,应该选择合适的列作为连接条件,并根据具体需求选择适当的连接类型,以确保查询结果符合预期且具有良好的性能。

ForkJoin 并行计算框架概览

ForkJoin 并行计算框架概览

Fork/Join 并行计算框架概览应用程序并行计算遇到的问题当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展。

多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量。

而现在很多的应用程序在运行在多核心的处理器上并不能得到很好的性能提升,因为应用程序的并发处理能力不强,不能够合理有效地的利用计算资源。

线性的计算只能利用n分之一的计算支援。

要提高应用程序在多核处理器上的执行效率,只能想办法提高应用程序的本身的并行能力。

常规的做法就是使用多线程,让更多的任务同时处理,或者让一部分操作异步执行,这种简单的多线程处理方式在处理器核心数比较少的情况下能够有效地利用处理资源,因为在处理器核心比较少的情况下,让不多的几个任务并行执行即可。

但是当处理器核心数发展很大的数目,上百上千的时候,这种按任务的并发处理方法也不能充分利用处理资源,因为一般的应用程序没有那么多的并发处理任务(服务器程序是个例外)。

所以,只能考虑把一个任务拆分为多个单元,每个单元分别得执行最后合并每个单元的结果。

一个任务的并行拆分,一种方法就是寄希望于硬件平台或者操作系统,但是目前这个领域还没有很好的结果。

另一种方案就是还是只有依靠应用程序本身对任务经行拆封执行。

Fork/Join框架依靠应用程序本身并行拆封任务,如果使用简单的多线程程序的方法,复杂度必然很大。

这就需要一个更好的范式或者工具来代程序员处理这类问题。

Java 7也意识到了这个问题,才标准库中集成了由Doug Lea开发的Fork/Join并行计算框架。

通过使用Fork/Join 模式,软件开发人员能够方便地利用多核平台的计算能力。

尽管还没有做到对软件开发人员完全透明,Fork/Join 模式已经极大地简化了编写并发程序的琐碎工作。

对于符合Fork/Join 模式的应用,软件开发人员不再需要处理各种并行相关事务,例如同步、通信等,以难以调试而闻名的死锁和data race 等错误也就不会出现,提升了思考问题的层次。

基于三级存储器的Join算法

基于三级存储器的Join算法

基于三级存储器的Join算法李建中;张冬冬;张艳秋【期刊名称】《软件学报》【年(卷),期】2003(014)005【摘要】研究了基于三级存储器的海量关系数据库的Join算法.目前,在所有磁带数据Join算法中,基于Hash思想的算法是最优的.但是,这些算法没有考虑从第三级存储器中读取数据时,磁带定位时间对算法性能的影响.磁带的磁头随机定位耗时大,是影响基于三级存储器的数据操作算法时间复杂性的关键因素.针对这个问题,提出了两种新的基于三级存储器的海量关系数据库连接算法,即Disk-Based-Hash-Join算法和Tertiary-Only-Hash-Join算法.这两种算法采用了磁盘缓冲技术和散列数据集中存储方法,降低了算法的磁带磁头随机定位时间复杂性,提高了基于三级存储器的连接算法的性能.理论分析和实验结果表明,提出的基于三级存储器连接算法的性能高于目前所有同类算法的性能,可以有效地应用于海量数据管理系统.【总页数】8页(P947-954)【作者】李建中;张冬冬;张艳秋【作者单位】哈尔滨工业大学,计算机科学与技术学院,黑龙江,哈尔滨,150001;黑龙江大学,计算机科学与技术学院,黑龙江,哈尔滨,150080;哈尔滨工业大学,计算机科学与技术学院,黑龙江,哈尔滨,150001;哈尔滨工业大学,计算机科学与技术学院,黑龙江,哈尔滨,150001【正文语种】中文【中图分类】TP311【相关文献】1.第三级存储器中的磁带选择算法 [J], 张艳秋;李建中2.基于MapReduce的内存并行Join算法研究 [J], 李成;许胤龙;郭帆;吴思3.基于三级存储器的多媒体服务请求调度策略 [J], 李光琪;张艳秋;李建中4.局域网环境中基于三级存储器的机群多媒体服务器框架 [J], 李光琪;张艳秋;张兆功;李建中5.基于Fork/Join框架的等值面快速生成并行算法 [J], 鲍婷婷; 焦圣明; 殷笑茹; 陈景丽; 牛霭琛因版权原因,仅展示原文概要,查看原文内容请购买。

三级嵌入式总结

三级嵌入式总结

1.计算机由运算器、控制器、存储器、输入设备和输出设备组成5个部分2.辅助存储器就是硬盘光盘等等。

3.存储器的3个主要性能指标是:存储容量、存取速度和每位价格4.8253定时器,模式0,赋初值一次启动一次,计数结束(-0)产生中断。

写入计数值后,第一个脉冲负责装载,后续的N个脉冲才是计数值。

比如写入初值10,需要11个脉冲才会产生中断.gate端口,低电平暂停计数5.文件的逻辑结构:无结构流式文件、定长记录文件、不定长记录文件。

6.文件目录是把所有文件控制块有机地组织起来形成的集合。

7.文件描述符:几个符号常量,1代表输出成功。

0.代表输入。

2.代表错误。

8.允许动态扩充内存容量的方案是“虚拟页式存储”9.批处理操作系统的缺点是:缺少“交互性”10.Pthread线程包,yield线程主动释放CPU来运行其他线程,join等待其他“线程”的结束11.进程调度=(进程放入运行)12.进程的同步关系:多个进程之间有明显的前后关系13.P操作,申请资源,资源数减一,V操作,释放资源,资源数目加一14.死锁定理的描述是:当且仅当该系统的资源分配图是不可完全化简的时候,该系统将会处于死锁状态。

15.一个完整的指令周期应包括:取指周期、执行周期、间址周期和中断周期16.fork()是系统调用17.内存的利用率较高且管理简单的方法:页式分配管理方案18.文件存储空间的分配单位通常是:数据块19.为了管理文件,系统为每个文件都设置一个文件控制块FCB,包含了文件的各种信息:文件名物理地址等等20.磁盘调度算法的复习!电梯算法(扫描算法)21.FAT32文件系统:链接结构22.寻址能力达到XXB,用数据容量大小来说明寻址能力,实际上是表达了:能寻址的范围最大是XX个单元,若按字节编址的话,最大的数据容量是XXB,地址线条数N=log2(XX) 23.中断向量:指向中断服务程序的代码,执行后有指向的作用中断向量地址:“指向代码”的存储空间的地址,也就是中断服务程序地址的指针。

join方法

join方法

join方法Join方法是一种常用的数据处理方法,它可以将两个或多个数据集合并在一起,从而实现数据的整合和分析。

在不同的编程语言和数据处理工具中,Join方法都有不同的实现方式和参数设置,但其基本原理和作用是相似的。

本文将介绍Join方法的基本概念、常见类型和使用技巧,帮助读者更好地理解和应用这一重要的数据处理技术。

1. 基本概念。

在数据处理中,Join方法用于将两个或多个数据集按照指定的条件进行合并,生成一个新的数据集。

通常情况下,需要指定一个或多个连接键(Join Key),用于确定数据集中的记录如何进行匹配。

在进行Join操作时,通常会涉及到左表(Left Table)、右表(Right Table)、连接类型(Join Type)等概念。

2. 常见类型。

根据连接键的匹配方式和数据集的合并规则,Join方法通常可以分为几种常见类型,包括内连接(Inner Join)、外连接(OuterJoin)、左连接(Left Join)、右连接(Right Join)等。

每种类型都有其特定的应用场景和用法,可以根据实际需求选择合适的连接类型进行数据合并。

3. 使用技巧。

在使用Join方法时,需要注意一些常见的技巧和注意事项,以确保数据合并的准确性和高效性。

例如,需要确保连接键的数据类型和取值范围一致,避免因数据不匹配而导致合并错误;在处理大规模数据时,可以考虑使用索引或分区等技术来优化Join操作的性能;对于复杂的合并需求,可以通过多次Join或使用临时表等方式来实现。

4. 示例演示。

为了更好地理解和掌握Join方法的使用,下面通过一个简单的示例来演示其具体操作步骤。

假设有两个数据集A和B,需要按照它们的ID字段进行内连接,并将结果存储到新的数据集C中。

具体的代码实现可以根据具体的编程语言和数据处理工具进行调整,但其基本逻辑和步骤是相似的。

```python。

# 使用Python的pandas库进行数据合并。

mysql join 原理

mysql join 原理

mysql join 原理MySQL Join原理MySQL Join是SQL语言中最重要的操作之一,它用于将两个或多个表中的数据组合起来,生成一个新的结果集。

Join操作可以通过多种方式实现,包括Inner Join、Left Join、Right Join和Full Outer Join等,不同的Join方式适用于不同的数据组合场景。

一、Inner Join原理Inner Join是最常用的Join方式之一,它只返回两个表中相互匹配的行。

具体实现过程如下:1. 对于需要连接的两个表T1和T2,首先从其中一个表(通常是行数较少的那个表)开始扫描。

2. 对于每行数据,在另一个表中查找是否有匹配的行。

如果找到了匹配行,则将这两行数据组合起来,并添加到结果集中。

3. 如果没有找到匹配行,则继续扫描下一行数据。

4. 当第一个表中所有数据都被扫描完毕后,Inner Join操作结束。

二、Left Join原理Left Join也是常用的Join方式之一,它返回左侧表中所有记录以及右侧表中与左侧表匹配的记录。

如果右侧表没有匹配记录,则将NULL 填充到结果集中。

具体实现过程如下:1. 对于需要连接的两个表T1和T2,首先从左侧表T1开始扫描。

2. 对于每行数据,在右侧表T2中查找是否有匹配的行。

如果找到了匹配行,则将这两行数据组合起来,并添加到结果集中。

3. 如果没有找到匹配行,则将左侧表T1中的这一行数据与NULL组合起来,并添加到结果集中。

4. 当左侧表T1中所有数据都被扫描完毕后,Left Join操作结束。

三、Right Join原理Right Join与Left Join类似,不同之处在于它返回右侧表中所有记录以及左侧表中与右侧表匹配的记录。

如果左侧表没有匹配记录,则将NULL填充到结果集中。

具体实现过程如下:1. 对于需要连接的两个表T1和T2,首先从右侧表T2开始扫描。

2. 对于每行数据,在左侧表T1中查找是否有匹配的行。

mysql join 原理

mysql join 原理

MySQL Join 原理一、引言MySQL是目前最常见的关系型数据库管理系统之一,它提供了强大的查询功能,其中的JOIN操作是实现多表关联查询的重要组成部分。

本文将深入探讨MySQL的JOIN原理,从底层实现、算法优化和性能调优等方面进行详细分析。

二、JOIN操作简介JOIN操作用于通过共享列将两个或多个表中的行进行关联。

常见的JOIN类型有INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN等。

在进行JOIN操作时,需要指定关联条件,即连接两张表的列,以便确定如何匹配记录。

JOIN操作是复杂的,需要数据库进行大量计算和比较,因此优化JOIN操作对于提高查询性能至关重要。

三、JOIN底层实现原理1. 嵌套循环JOIN嵌套循环JOIN(Nested-Loop Join)是最基本的JOIN算法。

它通过两层循环实现,即将一张表的每一行与另一张表的每一行进行比较,并找出符合连接条件的记录。

2. 排序合并JOIN排序合并JOIN(Sort-Merge Join)是一种高效的JOIN算法,适用于连接大型表。

它首先对连接列进行排序,然后将两张表的记录按照连接列的顺序进行合并。

排序合并JOIN适用于连接列有序的情况,但如果连接列无序,则需要先进行排序操作,增加了额外的时间和空间消耗。

3. 哈希JOIN哈希JOIN(Hash Join)是一种使用哈希表实现的JOIN算法,它适用于连接列无序的情况。

哈希JOIN首先将一张表的连接列构建成哈希表,然后将另一张表的记录逐行与哈希表进行匹配。

由于哈希表的查找速度非常快,所以哈希JOIN具有较好的性能。

四、JOIN算法优化1. 索引优化在进行JOIN操作时,如果连接列没有索引,数据库需要进行全表扫描,导致查询性能下降。

因此,优化JOIN操作的一个重要方面就是增加连接列的索引。

2. 增加缓存JOIN操作需要大量的内存来存储中间结果,因此增加缓存的大小可以提高JOIN操作的性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

V ol.14, No.5©2003 Journal of Software 软 件 学 报 1000-9825/2003/14(05)0947 基于三级存储器的Join 算法∗李建中1,2, 张冬冬1+, 张艳秋11(哈尔滨工业大学 计算机科学与技术学院,黑龙江 哈尔滨 150001) 2(黑龙江大学 计算机科学与技术学院,黑龙江 哈尔滨 150080)Join Algorithms Based on Tertiary StorageLI Jian-Zhong 1,2, ZHANG Dong-Dong 1+, ZHANG Yan-Qiu 11(College of Computer Science and Technology, Harbin Institute of Technology, Harbin 150001, China) 2(College of Computer Science and Technology, Heilongjiang University, Harbin 150080, China)+ Corresponding author: Phn: 86-451-6415827, Fax: 86-451-6415827, E-mail: z_dd@ Received 2002-03-04; Accepted 2002-12-24Li JZ, Zhang DD, Zhang YQ. Join algorithms based on tertiary storage. Journal of Software , 2003,14(5): 947~954./1000-9825/14/947.htmAbstract : The Join algorithms of massive relations in relational databases based on tertiary storage are studied in this paper. At present, Hash-Based Join algorithms are the best ones. However, the effect of tape locate time is not taken into consideration in these algorithms. It has great influence on the time complexity of the Join algorithms to locate positions on tertiary storages. For this reason, two new Join algorithms of massive relations in relational databases are proposed based on tertiary storage, Disk-Based-Hash-Join algorithm and Tertiary-Only-Hash-Join algorithm. Adopting disk buffer technique and the method of storing hashed data concentratedly, the cost of the random position locating on tertiary storage is much lower than other algorithms so that the proposed Join algorithms are more efficient. The analysis and experimental results show that the performance of this algorithms is superior to others, and thus they are suitable for massive database management. Key words :massive data; tertiary storage; join algorithm摘 要: 研究了基于三级存储器的海量关系数据库的Join 算法.目前,在所有磁带数据Join 算法中,基于Hash 思想的算法是最优的.但是,这些算法没有考虑从第三级存储器中读取数据时,磁带定位时间对算法性能的影响.磁带的磁头随机定位耗时大,是影响基于三级存储器的数据操作算法时间复杂性的关键因素.针对这个问题,提出了两种新的基于三级存储器的海量关系数据库连接算法,即Disk-Based-Hash-Join 算法和∗ Supported by the National Natural Science Foundation of China under Grant No.60273082 (国家自然科学基金); the NationalHigh-Tech Research and Development Plan of China under Grant No.2001-AA-415-410 (国家高技术研究发展计划); the National Grand Fundamental Research 973 Program of China under Grant No.G1999032704 (国家重点基础研究发展规划(973)); the National Research Foundation for the Doctoral Program of Higher Education of China under Grant No.2000021303 (国家教育部博士点基金)第一作者简介: 李建中(1950-),男,黑龙江哈尔滨人,教授,博士生导师,主要研究领域为数据库,并行计算.948 Journal of Software软件学报2003,14(5)Tertiary-Only-Hash-Join算法.这两种算法采用了磁盘缓冲技术和散列数据集中存储方法,降低了算法的磁带磁头随机定位时间复杂性,提高了基于三级存储器的连接算法的性能.理论分析和实验结果表明,提出的基于三级存储器连接算法的性能高于目前所有同类算法的性能,可以有效地应用于海量数据管理系统.关键词: 海量数据;三级存储器;连接算法中图法分类号: TP311文献标识码: A最近几年,随着信息技术的发展,特别是Internet技术的发展,各行各业的信息量都呈爆炸性增长趋势,高于1012字节的海量数据库已成为常见的数据库.目前Internet上已经拥有的数据量已达兆亿字节量级,并且还在不断扩大.我国海量数据库的数据量也在迅速增长.例如,黑龙江移动通信局3个月的信息量高达1 000亿字节;国家信息安全数据库3个月的数据量高达2 000亿字节;粒子碰撞实验每年产生的数据容量高达300TB;描述一架飞机全机构件的信息量就高于150G.显然,传统的基于二级存储器(主存储器和磁盘存储器)的数据库管理系统难以承担如此庞大的海量数据的存储与管理任务.海量数据需要使用基于三级存储器(主存储器、磁盘存储器和机器手磁带库等第三级存储器)的数据库管理系统来存储和管理.目前绝大多数数据库管理系统都是基于二级存储器的,难以管理海量数据.有些数据库系统把第三级存储器作为后援存储器来使用.这样的系统在处理第三级存储器上的数据时,先将第三级存储器上的数据复制到第二级存储器,然后使用基于二级存储器的数据库技术处理查询.当被查询的数据集合的大小大于第二级存储器的容量时,这种系统将无能为力.不言而喻,我们需要研究基于三级存储器的数据库技术.Join操作是一种最常用也是最耗时的数据库操作.本文旨在研究海量数据的Join算法.20世纪90年代,数据库工作者曾经开展过一些基于磁带的海量数据Join算法的研究,并提出了一些算法.这些算法可以分为两类,一类是基于Nested-Loop的思想算法[1,2],另一类是基于Hash的思想算法[1,3~5],具有代表性的基于Nested-Loop思想的算法包括Nested-Loop算法[2]和Concurrent-Nested-Loop算法[2].具有代表性的基于Hash思想的算法包括Grace-Hash算法[1]和Concurrent-Grace-Hash算法[3].下面,我们简单介绍这4种具有代表性的算法.以下,设|M|表示总的可用内存空间字节数,|M r|表示分配给Join关系R的内存空间字节数,|M S|表示分配给Join关系S的空间字节数,关系R和S分别存储在两条不同的磁带上,且内存和硬盘的可用空间都不足以完全容纳任何关系的全部数据.Nested-Loop(简称N-L)算法是最直观也是最简单的算法.它把关系R和S全部数据逐步依次调入内存执行Join操作.对于每次读入内存中的关系R的|M r|数据量,S中的全部数据都要读入内存一次,并与之进行Join.显然,N-L算法的效率非常低.为了改进N-L算法的性能,文献[2]提出了一种称为Concurrent-Nested-Loop(简称C-N-L)的算法.C-N-L算为了解决基于Nested-Loop思想的磁带数据Join算法的低效问题,文献[1]提出了基于Hash方法的磁带数据Join算法,称为Grace-Hash(简称G-H)算法.G-H算法首先将关系R,S中的数据分别散列到另一条磁带的数据区末尾形成各自的散列桶,然后将两个关系中具有相同散列值的散列桶进行Join.与基于Nested-Loop思想的算法相比,G-H算法的性能得到了很大的提高.但是,该算法有两个缺陷,一是需要在磁带之间额外传送两次相当于原关系大小的数据量,二是在从磁带上读取数据散列桶的过程中增加了磁带定位时间.在内存中完成数据散列操作的过程中,由于内存的空间小,内存中的散列桶会产生溢出,为了维持散列操作的正常实现,需要把将要溢出的散列桶提前回写到磁带上.然而,磁头在磁带上必须是顺序写数据的,所以造成了具有相同散列值的数据桶在磁带上不连续分布.紧接着下一步在完成散列桶之间Join的过程中,需要把具有相同散列值的数据桶都从磁带上读取到内存中,因此需要磁头不断地跳跃式定位到合适的磁带位李建中等:基于三级存储器的Join算法949置上去读取这些数据桶(如图1所示),从而产生了系统额外的时间开销,增加了算法的整体执行时间.为了进一步提高G-H算法的性能,文献[3]提出了一个称为Concurrent-Grace-Hash(简称C-G-H)的算法.C-G-H算法是对G-H算法的改进,它试图在完成散列桶之间的Join过程中使I/O操作和CPU操作并发执行.C-G-H连接算法首先将关系R,S中的数据分别散列到另一条磁带的数据区末尾形成各自的散列桶;然后把可用主存空间(大小为|M|)划分为3部分,第1部分(大小为|M r|)用来存储关系R的散列桶,第2部分和第3部分作为关系S的双主存缓冲区(每个大小为|M s|/2),记作Buff[0]和Buff[1],存放关系S的散列桶.在算法的执行过程中,当M r中的散列桶与Buff[0](或Buff[1])中的散列桶进行Join的同时,从磁带上读取S的其余散列桶到Buff[1](或Buff[0]),准备与M r中的散列桶进行Join.C-G-H算法在磁带定位时间开销方面存在着与G-H算法相同的缺陷.虽然基于Hash思想的已有算法是目前最优的磁带数据Join算法,但是,这些算法没有考虑从第三级存储器中读取数据时,磁带定位时间对算法性能的影响.我们通过大量的实验发现,第三级存储器的随机定位时间是影响算法时间复杂性的关键因素.为此,本文深入研究了在三级存储器环境下有效地完成Join操作的问题,提出了两种基于三级存储器的Join算法,即Disk-Based-Hash-Join算法(简称D-B-H-J算法)和Tertiary-Only-Hash-Join 算法(简称T-O-H-J算法).当磁盘可利用空间大的时候,D-B-H-J算法可以取得很好的性能;反之,当磁盘可利用空间较小的时候,T-O-H-J算法的性能好一些.与传统算法相比,本文提出的算法显著地降低了磁带定位时间.理论分析和模拟实验结果表明,本文提出的Join算法的性能高于已有的基于磁带的Join算法.1 磁带模型为了分析简单且易读,不失一般性,本文在进行算法的复杂性分析时,把锯齿型磁带作为三级存储器的第三级存储器.本文的算法和结论完全适合于其他类型的磁带.本节首先讨论锯齿型磁带的模型.锯齿型磁带是顺序存取设备,其模型可以由一组参数来表示.表1给出了人们常用的锯齿型磁带的模型参数,这些参数来自于文献[6,7].为了对算法的复杂性进行分析,我们还需要其他一些参数.表2给出了在分析算法性能过程中经常用到的参数的表示方法[4].Table 1Parameters of the tape model表1磁带模型参数Parameter Value Description Parameter Value DescriptionLibraryType Exabyte 220 Type of library TapeDriver Eliant 820Type of driverModelname 8mm Type of tape T apestartup21s Tape startup latency M ount40s Tape’s mounting time Numofdriver 2 Number of driversU nmount21s Tape’s unmounting time X T 1.5MB/s Mean transfer rate of the tape R OBOTMOVE10s Robot’s moving time X D11MB/s Mean transfer rate of the disk Tapelocate 5MB/s Tape’s locating speed sizeoftape18.98GB Available size of tapeTable 2Other parameters used in the algorithms表2算法分析中用到的其他参数Parameter Description Parameter Description |R| Size of relation R on tape |S| Size of relation S on tape|M r| Size of available buffer for relation R|M s| Size of available buffer for relation ST probe Mean time to probe a tuple in relations N bucket Numbers of buckets with different hash value S tuples_r Size of a tuple in relation R S tuples_s Size of a tuple in relation S|B ucket| Size of a bucket |D| Size of available disk spaceB tong_r Numbers of buckets with the same hash value inrelation R and it is equal to |R|÷|B ucket|÷N bucketB tong_sNumbers of buckets with the same hash value inrelation S and it is equal to |S|÷|B ucket|÷N bucket950 Journal of Software软件学报2003,14(5)2 Disk-Based-Hash-Join算法=2.1 算法描述D-B-H-J算法利用硬盘缓冲空间完成关系的Join,并且使I/O操作和CPU操作并发执行.与C-G-H算法思想类似,D-B-H-J算法把M r这一部分主存空间分成两部分(每个大小为|M r|/2),记作Buff[0]和Buff[1],用来存放关系R的散列桶.D-B-H-J算法首先将关系R按照|D|大小进行分块,将第1块散列到磁盘.然后将关系S的数据分块依次散列到内存M s中,分别与磁盘上关系R的散列桶进行Join.接着把关系R的下一个数据块散列到硬盘,依次循环下去,直到关系R中的数据全部扫描到磁盘一遍.在算法实现过程中,当M r中的关系S的散列桶与Buff[0](或Buff[1])中的关系R的散列桶进行Join的同时,从磁盘上读取R的其余散列桶到Buff[1](或Buff[0])中,准备与M r中的关系S散列桶进行Join.算法结束后,磁带上关系R的数据需要扫描一遍,而磁带上关系S的数据则需要扫描|R|/|D|遍.D-B-H-J算法的形式描述如下:(1) FOR i=1 To |D|/|X D| DO(2) 读取磁带R的大小为|D|的部分数据R′,使用Hash函数F散列R′,在磁盘上建立R′的Hash桶;(3) FOR j=1 To |S|/|M S| DO(4) 读磁带S的大小为|M S|的部分数据S′,用F散列S′,在M s中建立S′的Hash桶;(5) 读取磁盘中关系R的第1部分Hash桶到内存Buff[0]中;(6) WHILE 磁盘中关系R的Hash桶没有取尽DO /* (7)和(8)并发执行 */(7) 依次读取磁盘中关系R的其他部分Hash桶到内存Buff[1](或Buff[0])中;(8) 对Buff[0](或Buff[1])和M S中的Hash桶进行Join;(9) ENDWHILE(10) ENDFOR(11) ENDFOR2.2 算法分析该算法需要扫描一遍磁带上的关系R,|R|/|D|遍关系S.算法中循环体((2)~(10))执行一次所需的时间为T dbhjtrans=|D|/X T+|D|/X D+(|S|/|M S|)·{|M S|/X T+Max[|D|/X D , N bucket·|M S|/(N bucket·S tuple_s)·|D|/(N bucket·S tuple_r)·T probe]},其中|D|/X T表示关系R中|D|字节数据从磁带读入内存中的时间开销,|D|/X D表示关系R的|D|字节数据在内存中散列后移动到硬盘上所需的时间或者从硬盘读取到内存的时间,|S|/|M S|表示关系S被扫描一遍的过程中磁盘上关系R的相同数据散列桶从磁盘读入内存的次数,|M S|/X T表示关系S的|M S|字节数据读入内存的时间,Max[|D|/X D, N bucket·|M S|/(N bucket·S tuple_s)·|D|/(N bucket·S tuple_r)·T probe]表示算法实现中I/O操作与CPU操作并发执行时的时间开销.因此该算法的数据传输的总时间代价为C DBHJ_trans=(|R|/|D|)·T dbhjtrans=|R|/X T+|R|/X D+|R|·|S|/(|D|·X T)+|(S|/|M S|)·(|R|/X D). (1)关系S需要被扫描|R|/|D|遍,因此磁头需要有|R|/|D|次从磁带数据末尾定位到磁带数据首部,该算法磁头定位总时间开销为C DBHJ_locate= (|R|/|D|)·(|S|/Tapelocate). (2)从算法的描述可以容易地看到,D-B-H-J算法的CPU Join操作时间复杂性为C DBHJ_join=(|R|/|D|)·(|S|/|M S|)·{N bucket·[|D|·(N bucket·S tuple_r)]·[|M S|/(N bucket·S tuples_s)]}|R|·|S|·T probe/(N bucket·S tuple_r·S tuple_s). (3)3 Tertiary-Only-Hash-Join算法3.1 算法描述T-O-H-J算法把G-H算法中关系S的数据散列桶重新调整顺序,使具有相同散列值的数据散列桶连续地排放在磁带上(如图2所示).然后在关系S调序后的散列桶和关系R的对应散列桶之间进行Join.T-O-H-J算法使李建中等:基于三级存储器的Join算法951I/O操作和CPU操作并发执行.与C-G-H算法思想类似,T-O-H-J算法用主存M r来存放关系R的散列桶,同时把主存M S分成两部分(每个大小为|M S|/2),记作Buff[0]和Buff[1],用来存放关系S的散列桶.当M r中的散列桶与Buff[0](或Buff[1])中的散列桶进行Join的同时,从磁带上读取S的其余散列桶到Buff[1](或Buff[0])中,准备与M r中的散列桶进行Join.算法的形式描述如下:(1) 建立关系R的Hash桶RH,写入磁带S末尾;(2) 建立关系S的Hash桶SH,写入磁带R末尾;(3) 取出磁带S,装载新磁带K;(4) 将磁带R上的散列桶SH调整顺序,使具有相同散列值的Hash桶连续存放,复制到磁带K上;(5) 取出磁带R,装载磁带S;(6) FOR i = 1 TO Hash桶的种类数(7) WHILE RH中第i类Hash桶没有取尽 DO(8) 读取RH中的第i类Hash桶中的部分Hash桶到内存M r中;(9) 读取SH中相应的第i类桶中的第1部分Hash桶到内存Buff[0](或Buff[1])中;(10) WHILE SH中的第i类Hash桶没有取尽DO /* (11)和(12)并发执行 */(11) 读取SH中相应的第i类Hash桶中的其他部分Hash桶到内存Buff[1](或Buff[0])中;(12) 对M r和Buff[0](或Buff[1])中的Hash桶进行Join;(13) ENDWHILE(14) ENDWHILE(15) ENDFOR在此算法实现过程中,为了重新调整关系S的散列桶排放顺序,需要额外的一条磁带,增加了轮换磁带的时间开销.即便如此,该算法的性能仍然优于原有算法.原因是关系R的散列桶只需扫描一遍,关系S的散列桶需要扫描多遍,而关系S的散列桶具有一定的排放顺序,因此极大地减少了Join过程中读取关系S的散列桶时的磁带定位时间开销.3.2 算法分析T-O-H-J算法首先需要对数据进行散列操作,此过程的时间代价为T halfhash=2·(|R|+|S|)/X T.然后,T-O-H-J算法需要交换磁带两次,每次的时间代价为T change=U nmount+R obotmove+R obotmove+R obotmove+M ount+Tapestartup.接着,T-O-H-J算法需要重新调整散列后关系S的Hash桶排放顺序.这一过程的时间代价为T ordertape=N bucket·[|S|/(X T ·N bucket)+|S|/(X T ·N bucket)]+T randlocate,其中T randlocate为读取关系S未经调整顺序的散列桶时的磁头定位时间代价(包括磁头跳跃式地读取同一类Hash桶的定位时间和磁头若干次从磁带数据散列桶尾部定位到磁带数据散列桶首部的时间).假设数据均匀分布,则磁带上具有相同散列值的散列桶按固定磁带间隔长度存放,因此可得T randlocate=N bucket·(N bucket−1)·B tong_s·(|B ucket|/Tapelocate)+N bucket·T HL_s.在完成Hash桶之间的Join过程中,算法实现时所需的时间代价为T join=N bucket·{[|R|/(N bucket·|M r|)]·T innerjoin+[|R|/(N bucket·|M r|)]·T partlocate}+N bucket·T HL_r ,其中,T partlocate为扫描关系S中的某同一类散列桶时磁头从数据散列桶尾部回绕到数据散列桶首部所需要的磁头定位时间,T innerjoin为执行内层循环((8)~(13))一次所需要的时间.它们的时间代价分别为T partlocate=B tong_s·(|B ucket|/Tapelocate)和T innerjoin=|M r|/X T+T locatetong+[|S|/(N bucket·|M S|/2)]·T tongjoin.上式中的T tongjoin表示第2层循环中在内存里具体执行某一次Join所需的时间,由于这一过程需要M r中的Hash桶与Buff[0](或Buff[1])的Hash桶进行Join,并且算法中实现了I/O操作与CPU操作的并发执行,所以它的时间代价952 Journal of Software软件学报2003,14(5)为T tongjoin=Max{(|M S|/2)/X T , (|M r|/S tuple_r)·[(|M S|/2)/S tuple_s]·T probe},T locatetong表示读取关系R的具有相同散列值的部分散列桶到内存M r中所产生的磁头定位时间,它的时间代价为T locatetong=(|M r|/|B ucket|)·(N bucket−1)·(|B ucket|/Tapelocate).通过以上分析可知,在算法实现过程中,总的磁头定位时间代价为C TOHJ_locate=T randlocate+(|R|/|M r|)·T locatetong+(|R|/|M r|)·T partlocate+N bucket·T HL_r.=(2·N bucket−1) ·(|R|/Tapelocate)+[2·N bucket−1+|R|/(N bucket·|M r|)]·(|S|/Tapelocate). (4)把上述分析中的所有含1/X T项的数据单独累加起来,可以得到磁带数据传输总时间开销为(包括交换磁带的时间)C TOHJ_trans=2·T change+2·(|R|+|S|)/X T+2·|S|/X T+|R|/X T+N bucket·[|R|/(N bucket·|M r|)][|S|/(N bucket·|M S|/2)]·[(|M S|/2)/X T]=2·T change+3·|R|/X T+4·|S|X T+[|R|/(N bucket·|M r|)](|S|/X T). (5) 从算法的形式描述易知,T-O-H-J算法的CPU Join操作时间复杂性为C TOHJ_join=N bucket·[|R|/(N bucket·|M r|)]·[|S|/(N bucket·|M S|/2)]·(|M r|/S tuple_r)·[(|M S|/2)/S tuple_s]·T probe=|R|·|S|·T probe/(N bucket·S tuple_r·S tuple_s). (6)4 理论分析对比本节将对上述提出的算法与传统的算法进行分析对比.由于C-G-H算法是效率最高的传统磁带数据Join算法,我们只需与该算法进行分析比较.4.1 Concurrent-Grace-Hash算法的分析在数据散列操作中,G-H算法读写关系R,S各一次,整个时间开销为T halfhash =2·(|R|+|S|)/X T .在做散列桶之间的Join时,关系R的全部散列桶需要读入内存一次,而关系S的全部散列桶需要读入内存N hash_trans=|R|/(N bucket·|M r|)次.从而总的I/O数据传输时间代价为C CGH_trans=T hash+|R|/X T+N hash_trans·(|S|/X T) =2·|S|/X T+3·|R|/X T+|R|/(N bucket·|M r|)·(|S|/X T). (7)假设磁带上的数据均匀分布,则在完成两个关系的某一类散列桶之间的Join过程中,当每次从磁带上读取一个散列桶时,磁头都需要从最近访问过的散列桶处跳跃N bucket−1个其他种类的散列桶,才能到达下一次需访问的散列桶位置.这一过程需要的定位时间代价为T getnext_locate=[(N bucket−1)·|B ucket|]/Tapelocate.其次,每次扫描完一遍某类散列桶之后,磁带R和S的磁头都需要从磁带数据散列桶末尾定位到磁带数据散列桶首部,这一过程的磁头定位时间代价分别为T HL_r=|R|/Tapelocate和T HL_s=|S|/Tapelocate.总共有N bucket类散列桶,因此G-H算法实现过程中所需总的磁头定位时间代价为C CGH_locate=N bucket·{B tong_r·T getnext_locate+[|R|/(N bucket·|M r|)]·B tong_s·T getnext_locate+T HL_r+[|R|/(N bucket·|M r|)]·T HL_s}=(2·N bucket−1)·(|R|/Tapelocate)+(2·N bucket−1)·[|R|/(N bucket·|M r|)]·(|S|/Tapelocate). (8) 因为总共有N bucket类散列桶,所以易知C-G-H算法的CPU Join操作时间代价为C CGH_join=N bucket·[|R|/(N bucket·|M r|)]·[|S|/(N bucket·|M S|/2)]·{(|M r|/S tuple_r)·[(|M S|/2)/S tuple_s]·T probe}=|R|·|S|·T probe/(N bucket·S tuple_r·S tuple_s). (9) 4.2 算法实现的总时间代价比较C-G-H算法、D-B-G-H算法和T-O-G-H算法中均实现了I/O操作与CPU操作的并发执行,因此当数据量大的时候,CPU操作时间开销已经几乎被I/O操作时间开销和磁带定位时间开销所掩盖.所以,不失一般性,本文把各自的磁带定位时间代价与I/O数据传输时间代价之和作为这3种算法实现时总的时间代价.由式(4)、式(5)、式(7)和式(8)可知,C-G-H算法与T-O-H-J算法的总时间代价之差为C CGH−TOHJ=(C CGH_locate+C CGH_trans)−(C TOHJ_locate+C TOHJ_trans)={(2N bucket−2)·[|R|/(N bucket·|M r|)]−(2·N bucket−1)}·(|S|/Tapelocate)−2·(|S|/X T) −2·T change.由表1中的参数可知,Tapelocate≈4·X T,2·T change≈224(s).对于处理海量数据的Join操作来说,由轮换磁带造成的2·T change时间开销可以忽略.因此李建中 等:基于三级存储器的Join 算法953C CGH −TOHJ ≈{(2·N bucket −2)·[|R |/(N bucket ·|M r |)]−(2·N bucket −1)−8}·(|S |/Tapelocate ).由于|R |远大于N bucket ·|M r |,从而有|R |/(N bucket ·|M r |)>[(2·N bucket −1)−8]/(2·N bucket −2),因此C CGH −TOHJ >0,即C-G-H 算法的总时间代价比T-O-H-J 算法的总时间代价要多.由于|D |>|M r |,所以[(N bucket ·|R |)/(N bucket ·|M r |)]·(|S |/Tapelocate )>(|R |/|D |)·(|S |/Tapelocate ).由表1中的参数可知,X D ≈2·Tapelocate ,从而可得(N bucket −1)·X D >N bucket ·Tapelocate .若令|M r |=|M S |,可得{[(N bucket −1)·|R |]/(N bucket ·|M r |)}·(|S |/Tapelocate )>(|S |/|M S |)·(|R |/X D ).易知|R |/X T >|R |/X D ,于是由式(1)、式(2)、式(7)和式(8)可知,C-G-H 算法与D-B-H-J 算法的总时间代价之差为 C CGH −DBHJ =(C CGH _locate +C CGH _trans )−(C DBHJ _locate +C DBHJ _trans )>{(2·N bucket −1)·(|R |/Tapelocate )+2·|S |/X T +|R |/X T +[|R |/(N bucket ·|M r |)]·(|S |/X T )}−(|R |/|D |)·(|S |/X T ).从上式可知,随着数据量的增大,C CGH −DBHJ >0,即C-G-H 算法的总时间代价比D-B-H-J 算法的总时间代价 要多.5 模拟实验结果本文算法的模拟实现环境为PII450,64MB 主存,400MB 硬盘,第三级存储器是一个型号为EXA 220的机器手磁带库.假定关系S 的大小为关系R 大小的2倍,且均存放在两条不同的磁带上. 5.1 算法的执行时间在相同的可利用硬盘空间环境下,图3中显示了随着关系数据量变化时各种算法性能的差异.从实验结果可以看出,算法D-B-H-J 和算法T-O-H-J 的响应时间明显少于传统连接算法.基于Nest-Loop 思想的算法性能要逊于基于Hash 思想的算法性能,这是因为前者的CPU Join 操作时间开销和I/O 读取次数都要比后者多.而D-B-H-J 算法和T-O-H-J 算法的优势体现在降低了磁头在磁带上读取数据桶时的随机定位时间开销. 5.2 算法局部时间开销对总时间开销的影响程度实验下面考察随着关系数据量变化,磁带定位时间开销、数据传输时间开销和CPU 的Join 操作时间开销分别对系统总时间开销的影响程度对比情况,实验结果如图4~图6所示.51250 1750 22501000020000300004000050000600007000080000 E x e c u t i o n t i m e (s )NL I /O t i m e -e x e c u t i o n t i m e r a t i o (s )NL CNL CNL GH GH CGH CGH DBHJDBHJ TOHJTOHJ250 750125017502250 250750Size of relation R (MB)Size of relation R (MB)Fig.3 Comparison of execution time of Joins Fig.4 Comparison of ratio of transferring time to total time 图3 各种Join 算法的总时间开销比较 图4 I/O 开销占系统总时间开销比例的比较L o c a t i n g t i m e -e x e c u t i o n C P U ’s t i m e -e x e c u t i o n t im e 0250 750 125017502250Size of relation R (MB)NL GH t i m e r a t i o (s )CNL CGH GH R a t i o (s )DBHJ CGH TOHJDBHJ TOHJ2507501250 1750 2250Size of relation R (MB)Fig.5 Comparison of ratio of CPU’s time to total time Fig.6 Comparison of ratio of locating time to total time 图5 CPU 的时间开销占系统总时间开销的比例 图6 磁带定位时间开销占系统总时间开销的比例 如图4所示,随着数据量的增大,各种算法的数据传输时间开销占系统的总时间开销百分比均呈下降趋势,954 Journal of Software软件学报2003,14(5)最终低于15%,说明数据传输时间开销对系统的总时间开销影响不大.由于在C-G-H算法、D-B-H-J算法和T-O-H-J算法中均采用了I/O操作与CPU操作并发执行技术,因此随着数据量的增大,这3种算法中的CPU操作时间开销已经几乎被I/O操作时间开销和磁带定位时间开销所掩盖.但为了更清楚地比较各种算法中的CPU Join操作时间开销对系统总时间开销的影响程度,图5的实验结果中给出了各种算法的CPU Join操作开销占系统的总时间开销比值的对比情况.在基于N-L思想的算法中,CPU操作时间开销几乎占系统总时间开销的70%以上,相对来说,基于Hash思想的算法在这方面的比值要小一些,随着数据量的增大,达到30%以下.原因是N-L算法要求一个关系中的每一个元组都要与另一个关系中的所有元组进行连接测试操作,从而造成了数据的冗余连接,也带来了数据的冗余传输.相比而言,基于Hash思想的算法对数据进行了散列预处理,因而只要求一个关系中的每一个元组与另一个关系中的部分元组进行连接测试操作,则调入内存的数据量大大减少.在基于Hash思想的算法中,D-B-H-J算法和T-O-H-J算法的数据传输时间开销要比C-G-H算法和G-H算法多,这是因为D-B-H-J算法和T-O-H-J算法需要在C-G-H算法的基础上调整Hash桶的存放次序,这样就多了一些额外的数据传输时间开销.从图6中可以看出,随着数据量的增大,磁带定位时间开销与系统总时间开销的比值逐渐增大,最终达到了80%以上.说明磁带定位时间开销对系统总时间开销的影响较大.综上所述,各种算法的数据传输时间开销对系统总时间开销的影响不大,且随着数据量的增大,降到了15%以下.对于基于Nest-Loop思想的算法来说,CPU的 Join操作时间开销对系统总时间开销的影响比较大,超过了70%.对于基于Hash思想的算法来说,磁带定位时间开销对系统总时间开销的影响比较大,且随着数据量的增大,达到了80%以上,而CPU的Join操作时间开销和数据传输时间开销分别对系统总时间开销的影响较小,且随着数据量的增大,降到了30%以下.6 结论本文提出了两种新的基于三级存储器海量关系数据Join算法,即Disk-Based-Hash-Join算法和Tertiary-Only-Hash-Join算法.与传统的算法相比,这两种算法考虑了磁带随机定位时间开销大,是影响基于三级存储器的数据操作算法时间复杂性的关键因素这一特点.新算法中在减少磁头定位时间方面作了一些改进,并取得了良好的性能.通过数学理论分析对比以及大量的实验考察,不仅充分说明新算法在相同内存环境下的系统响应时间少于其他传统Join算法,而且也说明了在研究海量数据的Join算法的性能时,仅使用I/O调度次数的多少来评价算法的性能好坏是片面的.因为从这些实验结果中可以看出,数据传输的时间开销对算法执行的总时间开销不是起决定性作用,起更大作用的是CPU的Join操作时间开销和磁头定位时间开销.从而,可以得出一个结论:在设计分析海量关系代数操作算法时,我们必须充分考虑CPU的Join操作时间开销、磁带定位时间开销和I/O数据传输时间开销等综合因素,尽量减少磁带定位时间开销.References:[1] Myllymaki J. Joins on tapes: project report [MS. Thesis]. Madison: University of Wisconsin-Madison, 1993.[2] Kim W. A new way to compute the product and join of relation. In: Chen PP, Sprowls RC, eds. Proceedings of the 1980 ACMSIGMOD International Conference on Management of Data. Santa Monica, CA: ACM Press, 1980. 179~187.[3] Myllymaki J, Livny M. Relational joins for data on tertiary storage. In: Alex G, Per-Ake L, eds. Proceedings of the 13thInternational Conference on Data Engineering. Birmingham: IEEE Computer Society, 1997. 159~168.[4] Kraiss A, Muth P, Gillmann M. Tape-Disk join strategies under disk contention. In: Mike P, Calton P, eds. Proceedings of the 15thInternational Conference on Data Engineering. Sydney: IEEE Computer Society, 1999. 552~559.[5] Myllymaki J, Livny M. Disk-Tape joins: Synchronizing disk and tape access. In: Satish T, Isi M, eds. SIGMETRICS. Ottawa: ACMPress, 1995. 279~290.[6] Exabyte Corporation. SCSI Reference: EXB-8205 and EXB-8505 8mm Tape Drives for Standard and eXtended-Lengthconfigurations, 510503-004. 1685 38th St., Boulder, CO, 1994.[7] Johnson T, Miller EL. Performance measurements of tertiary storage devices. In: Ashish G, Oded S, Jennifer W, eds. Proceedingsof the 24th VLDB Conference. New York: Morgan Kaufmann Publishers, 1998. 50~61.。

相关文档
最新文档