`

数据仓库的模型和join算法

 
阅读更多
   数据仓库中经典模型主要有两种:一种是雪花模型,另外一种就是星座模型。简单的来说,雪花模型中是一个事实表,和若干个维度表,事实表通过外键和维度表关联。星座模型中存在着不止一个事实表,引用若干维度表,事实表直接也相互关联,目前数据仓库领域公认的TPCH测试集所使用的数据就是一个星座模型。从某种意义上说星座模型是对雪花模型的一种优化,因为在雪花模型中,唯一的事实表很可能需要只做到了第三范式,如果进一步优化达到第四范式,雪花模型就演变成了星座模型。
   有过数据库调优经验的人会发现,在数据库中,第三范式有些时候可能性能比第四范式要好,具体来说,这个取决于具体的查询。第三范式相对第四范式来说,省去了两个表做连接的操作,但是付出的代价就是数据有冗余,在某些情况下,查询的性能要好于两个表之间的连接。因此,对于一个数据仓库的建模来说,具体是雪花模型还是星座模型,具体取决于实际的应用。在工业界的TPCH测试集中,整个的数据库的schema就是一个星座模型,两张事实表:lineitem和order表,其余均为维度表,表直接通过外键关联。TPCH的测试实例包括22个SQL,其中有2条SQL是针对lineitem表的单表查询,另外的20条SQL都涉及到了join。在这20条SQL中,其中有:一条SQL完全是对于维度表的查询;另外有一条SQL是对lineitem的查询,但是涉及到了子查询,这个简单的子查询一般在查询优化时,都会被上提作为一个左半连接;剩下的18条则都涉及到了内连接。所以,一个出色的数据库/数据仓库产品必须很好的处理这些join才能提供给有说服力的测试数据。
    因此,在这里,就不得不说说数据库中的join算法。join算法是一个很古老的话题,但是,也是一个很活跃的话题。
    目前,基本的传统关系数据库都提供了多种join算法。最简单的是nestloop,具体伪码如下:
    for each row R1 in the outer table
    for each row R2 in the inner table
        if R1 joins with R2
         {
            return (R1, R2)
          }
    nextloop适用于数据比较小的情况下使用,为了处理更大的数据,一般还都提供了基于hash的join和基于sort的merge-join。hash-join先选择一个小表作为outer table建立一张hash表,然后针对inner table 的每条记录在hash表中进行查找,很显然,hash表的查找算法复杂度为O(1),但是引入了建立hash表的代价;而merge-join则一般对两个表进行外部多路归并排序,然后,读取两个有序文件来做join。具体的算法这里就不一一列出了。
    这里说的数据较小,并不等价于说表很小,而是说join这个操作符所作用的数据很小。举个例子,对于SQL: select * from t1 inner join t2 on key1 where t1.key2 = a and t2.key3 = b,其中key2 和key3都不是索引或是键。一般来说,数据库会为这条SQL生成这样一个查询计划:
                          join
                        /      \
                       /        \
           filter(key2=a)     filter (key3 = b)
                     /            \
                    /              \
                 scan t1          scan t2
join的输入实际上是两个filter操作符的输出,而filter的输入来自下层的scan 操作符。数据库在确定采用何种join的算法时,对各种join算法的代价进行计算,选择最小的那个。
   一般来说,join算法中, nestloop的启动代价比较小,但是运行的代价比较大,因为nestloop这个操作符启动时的需要做的初始化步骤比较少,而对于hash-join和merge-join则需要一些准备工作,hash-join一般都需要初始化一个内置的hash表。merge-join需要排序。对于数据量超过一定阈值时,数据库一般倾向于根据代价来选择hash-join或是sort-merge-join (具体如何计算代价,回头有时间结合PG的源码再写一篇博客)。
    目前,PGSQL提供了前面提到的这些join算法,mysql 5.1只提供了nextloop(好久没有看mysql的源码,不清楚是否新版本的mysql在这方面的改进,抱歉)。相对来说,在数据量较大的情况下,nextloop的操作代价远大于hash-join或是sort-merge-join。假设这么一种情况:如果数据库所能使用内存只有L个单位(在PG中默认的一个单位一般是8K大小),而join运算符的outer table和 inner table分别需要的内存为M个单位和N个单位。而我们知道数据库都会为表提供缓存,对于这些缓存也有相应的替换算法,例如PGSQL中就提供了clock-wise算法,clock-wise可以看做是在FIFO的基础在再多给一次机会。而mysql的表的缓存管理主要取决于表的引擎类型,具体算法可以google。我们可以简单的将这些算法看做是FIFO。以nextloop为例,假设读取或是写入一个单位大小的磁盘数据需要一次IO,如果M和N都小于L,那么就可以将一个表先读入内存,然后逐块读入另外一个表的数据,来做join,这样操作的代价为M+N次IO,而如果N和M都大于等于L,则会因为页面的替换算法,不可避免的将已读取的页的换出,这样的操作代价就是M*N次IO。 这样的结论同样也适合hash join。而sort-merge-join来说,在内存有限的情况下,操作的复杂度则是O(M*log(M)+N*log(N))。在数据量比较大的情况下,很明显,merge-join的操作代价小很多。
   在这里需要指出的是,之所以把一个复杂的查询代价简化成IO代价,主要因为是目前在单机上,磁盘的访问速度远低于内存和CPU上的cache,数据仓库中SQL主要的开销还是在磁盘上。
   因此,如果join需要处理相对比较大的数据时,hash-join和smerge-join要比nextloop 快很多。所以,在这方面PGSQL相对来说要优于mysql。因此,从这方面来说,目前商业的MPP系统(例如Greenplum和AsterData)选择PGSQL做为内部的节点不是没有理由的。
   而在分布式的数据仓库中,为了处理join,也设计了若干种算法。这些算法和传统关系数据库中join算法有着很大的联系。比较经典的分布式数据仓库(例如teradata)一般使用share-nothing的架构,相关的研究论文可以搜索gamma系统,威斯康星麦迪逊分校在这个项目上发表了诸多用意义的论文,大家可以google。
   share-nothing的数据仓库,简单的架构可以看作是一个中心节点和若干从节点,中心节点将查询处理之后,产生查询计划,然后将查询计划分发到各个节点执行,从节点上存储着水平分片的数据,从节点执行查询计划之后,将结果返回给中心节点,中心节点进一步处理之后将结果返回给用户。
    为了处理join, share-noting的分布式数据仓库中主要使用了三种常见的并行join算法:基于排序的并行join的算法,将参与join的算法按照连接的字段进行排序之后再分片,将各个分片分发到各个从节点,然后各个从节点执行sort-merge-join操作;基于hash的并行join算法,则在各个从节点上采用统一的hash算法进行分桶,然后将各个桶分发到对应的从节点上,从节点上执行join算法;全复制的并行join算法,这种算法适用于某个连接的表比较小的情况下,这个小表会在每个从节点上都有一个副本,然后直接执行join算法。
    之前,有同学问我:一个只有两个表做join的SQL在mysql上半天没有出结果,但是在N个datanode的hadoop上很快就有了结果,这个是为什么?对于这个答案,其实很简单,在这种情况下mysql上做join,操作代价退化为O(M*N),如果在hadoop上先对两个表直接hash分桶,然后join,操作的复杂度不过是O(N+M)(具体的复杂度可以根据实际的算法实现进行分析),很明显,这种简单的分布式join算法要明显快于单台的nextloop。
    可能这几种并行join算法比较古老,但是,如果你经常使用hadoop进行表之间的连接操作,你就会发现这三种算法会经常使用到。而hive中更是直接使用了mapjoin,事实上这就是经典的分布式并行数据仓库中使用的全复制的并行join算法。而在很多大数据的职位面试中,这些算法更是被经常提到,因此,在”大数据“这个烂大街的术语的时代里,这些算法应当成为常识。
   (本人对这方面理解不深,欢迎拍砖)
分享到:
评论

相关推荐

    oralce数据仓库基础

    通过学习《数据仓库基础.pdf》、《SQLSERVER21天自学通.pdf》和《数据仓储和数据仓库.pdf》,你可以深入理解数据仓库的概念,掌握Oracle数据仓库的构建、管理和优化技巧,为企业的数据分析和决策支持打下坚实的基础...

    大数据实战Demo系统-MaxCompute数据仓库数据转换实践.pdf

    大数据实战Demo系统-MaxCompute数据仓库数据转换实践主要围绕如何在MaxCompute中构建数据仓库并执行数据转换,以实现高效的数据管理和分析。MaxCompute是阿里云提供的一个大规模数据处理平台,适用于大数据处理场景...

    数据仓库的决策支持培训课件.pptx

    创建数据阵列以加速查询,预连接表格以减少JOIN操作,预聚集数据以优化滚动概括,聚类数据以提升查询效率,压缩数据以减少存储空间,以及定期净化数据以保持数据仓库的整洁和高效。 而探索者则更像数据分析师,他们...

    智能建筑系统中数据仓库的优化策略研究.rar

    根据查询模式和数据分布特性,将数据仓库划分为较小的、逻辑上的数据块,可以显著提高查询性能。例如,可以根据时间、地理位置或设备类型对数据进行分区。 3. **索引策略**:建立合适的索引可以加快数据检索速度。...

    智能媒体在数据仓库体系建设中的技术实践.pdf

    在数据分析领域,商业智能BI(Business Intelligence)扮演着关键角色,包括数据报表、OLAP(在线分析处理)和数据挖掘。其中,OLAP作为数据仓库中最常用的分析技术,是由Edgar F. Codd在1993年提出的,用于支持决策...

    实时OLAP数据仓库架构优化演进

    它适合星型模型,不支持大表之间的join,但是其lookup功能可以实现和维度表的join。Druid还支持聚合函数,如count和sum,可以使用JavaScript实现自定义UDF(用户定义函数)。阿里贡献的利用Bitmap实现精准的Distinct...

    数据工程师考试课后习题答案

    习题可能涉及到数据仓库的星型、雪花型和网状模型,以及如何构建和执行复杂的多维查询。 4. **数据处理与分析**:这部分内容涵盖数据清洗、转换、整合以及数据挖掘。习题可能要求考生解决数据质量问题,或者使用...

    关系模型和关系运算PPT学习教案.pptx

    数据仓库和数据挖掘是数据分析的关键,前者是用于决策支持的集成化、非易失性数据集合,后者则是从大量数据中发现有用信息的过程。 数据库管理技术的发展历程可以分为人工管理、文件系统和数据库系统三个阶段。早期...

    关系模型和关系运算PPT课件.pptx

    通过模式分解和等价覆盖算法,可以确保数据库满足特定的范式,如1NF(第一范式)到5NF(第五范式),这些范式是数据库规范化设计的基础,旨在减少数据冗余和提高数据一致性。 数据库系统设计涵盖了从需求分析到实现...

    [#0x003A] join

    在实际应用中,join操作常用于数据仓库和大数据分析中,帮助我们综合不同来源的数据,进行复杂的数据挖掘和报表生成。同时,理解并优化join操作对数据库性能的影响也非常重要,因为大型数据集的join操作可能导致查询...

    hadoop学习-基于hive的航空公司客户价值的LRFCM模型案例数据源

    Hive则是在Hadoop之上构建的数据仓库工具,用于查询和管理大型数据集。它提供了SQL-like的查询语言HQL(Hive Query Language),使得非编程背景的用户也能便捷地操作大数据。 航空用户模拟数据.csv文件很可能是本次...

    数据库CH (20)1

    数据库是存储和管理数据的核心工具,而数据仓库和数据挖掘是现代数据分析的两个关键领域。在本章中,我们将深入探讨这两个主题,并了解它们在信息技术中的重要性。 数据仓库(Data Warehousing)是专为决策支持系统...

    大数据分析的流程.docx

    数据挖掘是通过算法和技术发现数据中的模式和规律的过程。 1. **算法选择**:根据业务需求和数据特性选择合适的挖掘算法。 2. **算法调优**:通过不断试验调整算法参数,提高模型的准确性和实用性。 3. **工具应用*...

    用户行为大数据分析 PPT

    在这个案例中,由于没有建立主数据仓库,导致主数据处理和行为数据处理相互交叉,增加了数据处理的复杂性和计算量,使得错误排查变得困难。 - **优化方案**:建议建立专门的主数据仓库,并采用更加高效的数据处理...

    Java_数据工程路线图.zip

    理解数据清洗、数据转换和数据质量检查是这个阶段的关键。 5. **流处理**:随着实时数据处理的需求增长,Kafka、Flink和Spark Streaming等技术变得越来越重要。你需要了解如何处理实时数据流,并实现低延迟的数据...

    广工数据挖掘12年试卷

    5. **数据库与数据仓库**:基础的SQL查询语言知识,例如SELECT、JOIN、WHERE等语句,以及对数据仓库的基本概念和架构的理解,可能也会在试题中出现。 6. **机器学习理论**:包括监督学习、无监督学习、半监督学习和...

    数据科学导论2021-2022期末试题回忆.docx

    Extract是指从各种源系统中抽取数据,Transform是对数据进行清洗、转换,使其满足目标系统的格式要求,Load则是将处理后的数据加载到目标系统,如数据仓库或数据湖。 XML(Extensible Markup Language)是一种用于...

    数据挖掘(1)1

    数据挖掘是一种从海量数据中发现有价值知识...这些知识点展示了数据挖掘领域的核心概念和技术,涵盖了从数据预处理、特征工程到模型构建和评估的全过程。理解并掌握这些概念对于进行有效的数据探索和知识发现至关重要。

Global site tag (gtag.js) - Google Analytics