日期:2014-05-16  浏览次数:20382 次

Study-Hard-数据库连接及实现内部原理(下)

        注:本文成文思路,来自炼数成金——《数据库引擎开发课程》——王涛老师

        注:本文章,禁止未经允许的转载,但用于学习、研究目的的用处除外(注明出处:以链接的方式)

        在数据库中,我们经常会用到如下操作:聚集(Group By)、去重(Distinct)、关联等操作。

        这些操作的前提,或者说本质上,都离不开排序操作,下面分别看下这些操作,并对关联进行着重讲解,通过讲解可以理解一定的SQL优化原理。


一、Group By


        
        通过上图,可以看书,GroupBy,进行排序操作,然后在对相同的记录进行GroupBy操作,这里的重点就是排序了

二、唯一DISTINCT


        
        对于Distinct操作,首先仍是排序,排序后,则输出结果,这里需要一个比较操作,即用当前值与后续值进行比较,如果已经输出过,则不再输出。

三、关联操作

        
        对于关联操作,也就是多表的关联,这里以量表为例,TableA、TableB;而相对来说,当表空间非常大,或者存在索引与否,对于sql的执行速度都是有影响的,通常而言,在关联操作时,会有三种:嵌套、归并关联、hash关联(在数据库连接及内部原理(上)有叙述),下面分别看看这三种关联,并附加实现代码。

3.1 嵌套循环

        
        对上图进行简单的解释,在进行嵌套循环的时候,通常情况是(大表+小表)的形式,并且会以小表作为内表,因为小表可以常驻内存这样当进行磁盘IO的时候,只有大表会产生开销;反之,如果因为大表过大,则大表不能常驻内存,内外表的数据均存在与磁盘中,这样,进行磁盘IO开销是非常“可观”的:(。
        解释了,谁做内外表的问题后,看下嵌套关联的操作过程:
        1.取得要操作的表空间
        2.对表空间的记录进行排序
        3.通过嵌套循环进行赛选(如果是双表,可能是两个for嵌套)
        4.获得需求的记录

3.2 归并关联


        对与归并关联,有着很好的时间复杂度(如果两个表中的元素已经排序,如果未排序,时间开销可能为XlogX + YlogY