`
datamachine
  • 浏览: 163989 次
社区版块
存档分类
最新评论

多层外键连接的文件计算实现

    博客分类:
  • DB
阅读更多

在结构化数据计算任务中,会出现源数据来自多层外键关联的多个数据表的情况。例如要在订单系统中计算出比较特殊的订单,就遇到了下图中的多层外键结构。具体的计算需求是:求产品供应商和订单的客户在同一个地区的订单,这些订单按照客户分组求每组的订单总价和个数。

  数据结构示意图如下:



 如果用数据库完成,需要的SQL脚本如下:

select cid,count(ordered),sum(price*quantity) from orders
left join customer on orders.cid=customer.cid
left join region a1 on customer.city=a1.city 
left join product on orders.pid=product.pid
left join supplier on product.pid=supplier.sid
left join region a2 on supplier.city=a2.city
where a1.region=a2.region and to_char(orderdate,’YYYY’)=?
Group by cid

 

 面来看一下采用集算器文件计算方案实现这个需求的方法。

  定义网格参数year,编写多层外键关联计算的集算脚本orders.dfx如下:


 

   A1:从本地文件建立订单表的文件游标,游标可以分段处理数据,防止出现内存溢出。

  A2:在A1中过滤一年的订单数据,year是预先定义好的网格参数。

  A3-A6:从本地读取维表的数据,依次是:客户、产品、供应商和地区。

  A7:将客户序表中的“city”键值切换成地区序表中对应的记录引用。

  A8:将供应商序表中的“city”键值切换成地区序表中对应的记录引用。

  A9:将产品序表中的“sid”键值切换成供应商序表中对应的记录引用。

  A10:将订单序表中的“pid”键值切换成产品序表中对应“pid”的记录引用。

  A11:将订单序表中的“cid”键值切换成客户序表中对应“cid”的记录引用。

  A12:在订单序表中,按照条件过滤。因为经过了A7-A11的切换,条件写为:pid.sid.city.region==cid.city.region。

  A13:在过滤结果的基础上分组汇总。

  A14:将A13返回给外部程序。

  如果事实表orders表数据量很大,可以采用集算器的多线程并行计算方案,以提高处理性能。其他的维表比较小,可以装入内存。多个线程之间可以共享维表。

  实现脚本如下:



 

   A1-A4:从本地读取维表的数据,依次是:客户、产品、供应商和地区。

  A5:将客户序表中的“city”键值切换成地区序表中对应的记录引用。

  B5:将供应商序表中的“city”键值切换成地区序表中对应的记录引用。

  C5:将产品序表中的“sid”键值切换成供应商序表中对应的记录引用。

  A6:设置并行数。

  A7:按照A6并行执行。

  B7:从本地文件建立订单表的文件游标,每个线程处理一部分数据。

  B8:将订单序表中的“pid”键值切换成产品序表中对应“pid”的记录引用。

  B9:将订单序表中的“cid”键值切换成客户序表中对应“cid”的记录引用。

  B10:在订单序表中,按照条件过滤。因为经过了A7-A11的切换,条件写为:pid.sid.city.region==cid.city.region。按照年份过滤。

  B11:分组汇总。

  B12:线程返回结果B11。

  A13:纵向合并A7。

  A14:再做一次分组汇总。

  A15:向外部程序返回结果A14。

  需要说明的是,集算脚本支持从数据库或者从文件中读取数据。因此,可以根据业务情况决定各个维表和事实表存储的位置,比如:数据不经常变动的存储在文件中,经常变动的存在数据库中。存储在文件系统中的数据越多,性能越好,数据库压力也越小。

  • 大小: 22.5 KB
  • 大小: 89 KB
  • 大小: 106.5 KB
0
2
分享到:
评论

相关推荐

    2021-2022计算机二级等级考试试题及答案No.1347.docx

    MySQL连接**:`mysql_connect()`建立非持久连接,可以通过`mysql_close()`关闭连接。 - **26. 查询类型**:用于提取特定条件下的记录,生成新表。 以上就是从给定文件中抽取并解释的关键知识点,希望能帮助考生更...

    iw模板学习_按钮+表格显示+省市5级数据库.rar

    这个名为“iw模板学习_按钮+表格显示+省市5级数据库.rar”的压缩包文件,显然是一个关于如何在Delphi中实现交互式用户界面(UI)设计的教程或示例,特别是涉及按钮、表格显示以及省市五级数据库的联动操作。...

    2015年国网电力职称计算机考试题库.wps.pdf

    2. 局域网(LAN):局域网是一种在有限地理范围内(如办公室、校园或建筑物内)连接计算机的网络,通常用于共享资源和高速通信。 3. Access数据库:Access是由Microsoft开发的关系型数据库管理系统,用户可以创建、...

    .NET面试题

    14. Web.config文件:配置文件,包含应用程序设置、连接字符串等,可使用ConfigurationManager类读取。 15. ASP.NET身份验证:Forms、Windows、Passport和OAuth等,每种方式的安全性和实现机制不同。 16. 活动目录...

    2021-2022计算机二级等级考试试题及答案No.13754.docx

    - 子查询可以嵌套多层,但需要注意性能问题。 - SQL还支持联合查询、传递查询等其他类型的查询。 #### 题目16:数据库字段宽度 - **知识点概述**:考查数据库字段宽度设置。 - **详细解析**:字段的宽度应考虑其...

    管理信息系统(2-1)-技术基础.pptx

    计算机软件则包括应用软件(如发油系统)、系统软件(如数据库管理系统)以及单机、C/S(客户/服务器)、B/S(浏览器/服务器)和多层结构的应用程序。C/S结构和B/S结构的主要区别在于数据存储位置、系统性能、开发和...

    MySQL优化深度分析及问题集锦课堂笔记

    统计计数问题涉及到表的行数计算,join的优化要求合理选择连接类型和连接顺序,以减少不必要的数据扫描。 锁及常见性能问题分析: MySQL中的锁主要分为共享锁和排他锁。锁的性能问题会导致数据库操作变慢,特别是在...

    Oracle经典教程(推荐)

    抽象工厂模式可以实现数据库连接池的统一管理,通过配置文件动态加载Oracle数据源。 #### 第七章:数据库导入导出 - **Oracle导入导出** Oracle提供了强大的数据导入导出功能,方便数据迁移和备份恢复。 - **...

    oracle实用教程

    此外,还可以利用子查询来实现多层嵌套查询。 #### 四、子查询与常用函数 **子查询** 子查询是在另一个查询内部执行的查询。它可以嵌套在SELECT、INSERT、UPDATE或DELETE语句中,用于从数据库中检索特定的信息。...

    SQL21自学通

    - 主键、外键、索引等概念是设计数据库结构时需要考虑的关键因素。 - ER图(实体-关系图)是一种常用的设计工具,用于表示实体之间的关系。 - **SQL总览:** - SQL是一种用于管理关系型数据库的标准语言,包括...

    帆软认证BI工程师FCBA 题库

    虽然FineBI支持创建复杂的图表类型,但多层饼图并非简单地通过普通饼图转换而来,而是需要特定的设置和配置才能实现。 #### 10. 数值类型只能放置数值类型的数据进行筛选 **知识点:** - **数值类型筛选:** 对于...

    SQL 自学通

    通过连接数据库API,如Python的psycopg2或Java的JDBC,程序员可以在应用程序中执行SQL语句,实现数据的动态操作和展示。 #### 查询——SELECT语句的使用 SELECT语句是SQL中最常用的操作,用于从数据库中检索数据。...

    数据库课程学习的收获和心得体会.docx

    - **项目实践**:通过完成项目作业,如销售管理系统的设计与实现,增强综合运用知识的能力。 - **团队合作**:项目作业需要团队协作,培养沟通和解决问题的能力。 - **未来展望**:认识到数据库技术在各行各业的应用...

    Oracle课程目录

    - **自连接**:演示如何实现表与自身的连接。 #### 18. 左、右连接 - **LEFT JOIN和RIGHT JOIN的区别**:比较这两种连接方式的不同之处。 - **连接条件**:说明LEFT JOIN和RIGHT JOIN中的连接条件如何定义。 - **...

    SQL 21 日自学通(V1.0)

    - **在一个SELECT语句中使用多个表**:介绍如何通过JOIN关键字连接多个表,实现跨表查询。 - **等值联合**:使用等值条件进行表的连接。 - **不等值联合**:使用非等值条件进行连接。 - **外部联合与内部联合**:...

    SQL21天自学通

    - 数据库技术的历史可以追溯到1960年代,最初的数据管理方式是文件系统。 - 1970年代,随着关系型数据库的出现,数据管理进入了一个新的阶段。 - 1980年代至1990年代,关系型数据库系统得到了广泛应用,成为主流...

Global site tag (gtag.js) - Google Analytics