概述 组表是SPL重要的文件存储格式。为保证高性能,组表常常要求数据有序存储,但数据的产生次序通常和组表要求的次序不同,在维护组表数据时需要调整数据的次序。另外,…
实时追加例程—用内存避免小分表 背景与方法 参考下面文章 [链接] 该文章中采用多层分表的方式存储实时数据,对于数据追加频繁的场景,为了保证新数据能快速及时写出,采用…
内存列式计算 什么是列式存储 内存中的序表,一般是采用行式存储。例如员工表包含字段 id、name、birthday,在内存中大致是这样存储的: [图片] 每行(也就是每条记录)存…
[链接][链接]》介绍了 SPL 对关联计算的分类,以及内存关联计算的编程方法。 《[链接]》介绍了外存关联计算的编程方法。 本篇继续介绍 SPL 的新关联计算方法,包括:用于…
新出现的数据库产品通常会标榜自己的运算速度“最快”、“更快”,但在实际应用中却常常达不到让人满意的性能。因此,事先做好运算性能测试,是数据库选型成功的关键。很多用…
1 应用场景 和【实时追加例程】的应用场景类似,所不同的是需要对数据进行更新。本例程适用于具有如下特征的数据表的更新: 对数据更新的实时性要求很高、数据更新周期很…
1. 应用场景 本例程适用于具有如下特征的数据表的追加: 对数据追加的实时性要求很高、数据追加周期很短、任意时刻均有可能追加;数据只有追加无删除修改的需求;单次追加…
一、 测试任务 基于位置计算两个实体之间的距离,进而决定是否建立关联关系。这是典型的非等值关联运算,此时不能再使用 HASH 方法来优化。 任务原型来自国家天文台的星体…
有序存储是指将数据按照某些字段排序后再存储。在此基础上,我们可以实现某些高性能算法,利用数据有序的特征来降低计算复杂度,从而大幅提高计算性能。 免索引直接找 在…
SQL SELECT * FROM Customers WHERE CustomerID like '%ANA%' SPL A 1 =file(“Customers.ctx”).open() ..
在电商系统中,漏斗转化分析是很重要的数据分析计算。电商的用户在系统中会进行多个操作事件,例如页面浏览、搜索、加购物车、下单、付款等。这些事件有一定的先后顺序,…
SQL SELECT * FROM Customers WHERE CustomerID in ( SELECT DISTINCT CustomerID FROM Orders WHERE O ..
SQL SELECT * FROM Orders WHERE OrderDate>='2021-12-29' and OrderDate<='2021-12-31' SPL 对于数 ..
SQL SELECT * FROM Orders WHERE CustomerID='MAISD' SPL 像 CustomerID 这种字符串 ID 类的主键字段,一般常用的查找方式都是等值 ..
SQL WITH a AS( SELECT sum(Amount) Amount FROM Orders2021 WHERE Amount>500 or Quantity>50) ..
SQL SELECT ShipVia,sum(Quantity) Quantity FROM Orders2021 GROUP BY ShipVia ORDER BY ShipVia SELE ..
SQL SELECT City,sum(Amount) Amount FROM Customers INNER JOIN Orders2021 ON Orders2021.CustomerID ..
SQL SELECT City,ProductID, sum(Amount) Amount FROM Customers INNER JOIN Orders2021 ON Orders2021 ..
SQL SELECT Distinct CustomerID FROM Orders2020 UNION SELECT Distinct CustomerID FROM Orders2021 ..
在统计分析应用中,从明细数据计算出来的各种指标是支撑业务的重要数据。但是,要做到快速而且灵活的多指标计算,后台数据源面临多个难题。 多指标计算的一个难题是涉及的…
本章中要尝试更大数据量,将订单表按年分别存储成不同的表,表名为 Orders+ 年份,如 Orders2021,Orders2022,依此类推,表结构均和 Orders 相同 SQL SELE ..
SQL SELECT Customers.CustomerID,CustomerName,Region,City,Amount FROM Customers INNER JOIN Orders ..
SQL SELECT a.CustomerID,a.OrderDate,a.ProductID,a.Quantity,a.Unit, a.Price,a.Amount,a.EmployeeID ..
对于已经序号化的维表,可以利用对位序列来处理维表上的过滤。 原理:产生一个与维表同样长度的序列,其成员是布尔值,满足条件的维表记录对应 true,否则对应 false。然…
[链接]4.5.1 过滤后复用索引 SQL SELECT Suppliers.Region,sum(Amount) Amount FROM Orders LEFT JOIN Products ..
主键是自然数序号的维表,可以直接用序号定位实现关联,不必建索引,避免计算和比对 HASH 值,性能更好。 主键不是自然数序号的维表,可以事先转换成序号。同时把事实表中…
前面的例子均使用 switch 做维表的关联,能获得很好的性能,但还有几个问题: 1) 关联后,外键字段的本身值失去了,必须到维表中取主键才能获得,速度会变慢。 如上例:如…
SQL SELECT floor((year(curdate())-year(Employees.Birthday))/10) Age, sum(Orders.Amount) Amount F ..
[链接]4.1.1 单层维表 SQL SELECT Employees.Region,sum(Orders.Amount) FROM Orders LEFT JOIN Employees ON ..
按月统计出当月发生过连续三天都有订单的用户数 SQL WITH a AS( SELECT count (1) AS num, day (OrderDate) days, CustomerID, ..
SQL WITH m AS( SELECT *, row_number() OVER(PARTITION BY year(OrderDate),month(OrderDate) ORDER B ..
SQL SELECT count (DISTINCT CustomerID) num,year(OrderDate) years, month(OrderDate) months FROM O ..
SQL SELECT count (DISTINCT CustomerID) iNum,count(1) Num FROM Orders WHERE OrderDate>='2021-0 ..
一、 SQL 及分析 查询SQL语句如下: select cntrycode, count(*) as numcust, sum(c_acctbal) as totacctbal from ( ..
SQL SELECT DISTINCT month(OrderDate) FROM Orders WHERE OrderDate>='2021-01-01' and OrderDate& ..
按 CustomerID 排序后,可以快速实现针对 CustomerID 的去重和分组运算,遍历过程中只需要和上一条记录对比即可,也不需要保留结果集,速度快且不会有内存溢出问题。 [链…
一、 SQL 及分析 查询SQL语句如下: select * from ( select s_name, count(*) as numwait from supplier,lineitem ..
[链接]3.2.1 集文件 SQL SELECT count (DISTINCT CustomerID) iNum,count(1) Num,EmployeeID,EmployeeName F ..
一般业务数据都有发生时间属性,当时间跨度比较长时,查询统计往往需要先按时间段过滤。数据以时间有序存储时可以提升过滤速度。 [链接]3.1.1 集文件 存量数据:将数据读…
SQL WITH m AS( SELECT *, row_number() OVER(PARTITION BY year(OrderDate),month(OrderDate)) r FROM ..
SQL SELECT EmployeeID, EmployeeName,sum(Amount) AS Amount FROM Orders WHERE OrderDate>='2022- ..
一、 SQL 及分析 查询SQL语句如下: select s_name,s_address from supplier,nation where s_suppkey in ( select p ..
查询今年每个月金额最大的三个订单 SQL WITH m AS( SELECT *,rank() OVER(PARTITION BY year(OrderDate),month(OrderDat ..
一、 SQL 及分析 查询SQL语句如下: select sum(l_extendedprice * (1 - l_discount)) as revenue from lineitem,pa ..
查询今年每个月金额最大的三个订单的订单额 SQL WITH m AS( SELECT year(OrderDate) years, month(OrderDate) months, Amoun ..
一、 SQL 及分析 查询SQL语句如下: select * from ( select c_name, c_custkey, o_orderkey, o_orderdate, o_total ..
选出金额最大的订单 SQL WITH m AS ( SELECT max(Amount) mta FROM Orders WHERE OrderDate>='2022-01-01') S ..
一、 SQL 及分析 查询SQL语句如下: select sum(l_extendedprice) / 7.0 as avg_yearly from lineitem,part where p ..
查询单次购买数量超过 5 的产品及其价格、单位 SQL SELECT DISTINCT ProductID,Price,Unit FROM Orders WHERE Quantity>= ..
一、 SQL 及分析 查询SQL语句如下: select p_brand,p_type,p_size, count(distinct ps_suppkey) as supplier_cnt f ..
按月统计下单的客户数量 SQL SELECT count(DISTINCT CustomerID) num,year(OrderDate) years, month(OrderDate) mo ..
将取值可能有限的枚举字符串转换成整数后可以获得更好的存储和计算性能。 [链接]1.4.1 转储时转换 将枚举字段用取值序列的序号代替,这里以 ShipVia 举例 A 1 =file(“Shi …
将日期转换成小整数后能获得更好的存储和计算性能。 [链接]1.3.1 转储时转换 SPL 提供了一种很省空间的方法,用 days@o(date) 把年月转换成距离 1970 年起的月数,而日用 …
一、 SQL 及分析 查询SQL语句如下: create view revenue (supplier_no, total_revenue) as select l_suppkey, sum( ..
组表支持列存,在遍历时能获得更好的性能。 [链接]1.2.1 把数据表转储成组表 文本转储 A 1 =file(“Orders.txt”).cursor@t(CustomerID:string ..
1.1.1 把数据转储到集文件 文本转储 A 1 =file(“Orders.txt”).cursor@t(CustomerID:string, OrderDate:datetime, Pro ..
一、 SQL 及分析 查询SQL语句如下: select 100.00 * sum( case when p_type like 'PROMO%' then l_extendedprice * ..
数据准备 使用到的数据表结构如下: 表 字段名 含义 Categories [CategoryID] [int] NOT NULL, [CategoryName] [nvarchar](50) ..
一、 SQL 及分析 查询SQL语句如下: select c_count, count(*) as custdist from ( select c_custkey, count(o_orde ..
一、 SQL 及分析 查询SQL语句如下: select l_shipmode, sum(case when o_orderpriority = '1-URGENT' or o_orderpr ..
一、 SQL 及分析 查询SQL语句如下: select ps_partkey, sum(ps_supplycost * ps_availqty) as value from partsupp ..
一、 SQL 及分析 查询SQL语句如下: select * from ( select c_custkey,c_name, sum(l_extendedprice * (1 - l_disc ..
一、 SQL 及分析 查询SQL语句如下: select nation, o_year, sum(amount) as sum_profit from ( select n_name as n ..
一、 SQL 及分析 查询SQL语句如下: select o_year, sum(case when nation = 'CHINA' then volume else 0 end) / su ..
一、 SQL 及分析 查询SQL语句如下: select supp_nation, cust_nation, l_year, sum(volume) as revenue from ( sel ..
一、 SQL 及分析 查询SQL语句如下: select sum(l_extendedprice * l_discount) as revenue from lineitem where l_ ..
一、 SQL 及分析 查询SQL语句如下: select n_name, sum(l_extendedprice * (1 - l_discount)) as revenue from cus ..
一、 SQL 及分析 查询SQL语句如下: select o_orderpriority, count(*) as order_count from orders where o_orderd ..
一、 SQL 及分析 查询SQL语句如下: select * from ( select l_orderkey, sum(l_extendedprice * (1 - l_discount)) ..
一、 SQL 及分析 查询SQL语句如下: select * from ( select s_acctbal,s_name,n_name,p_partkey,p_mfgr,s_address, ..
一、 SQL 及分析 查询SQL语句如下: select l_returnflag, l_linestatus, sum(l_quantity) as sum_qty, sum(l_exten ..
一、 数据准备 利用TPCH官方工具生成文本文件形式的原始数据,共8个表,数据量总规模100G,各文件大小见后表。 然后根据这些文本文件生成SPL的二进制文件,每个表对应一个…
用 SPL 实现高性能计算,通常要将数据转存成 SPL 的格式。初次接触 SPL 的程序员对此比较陌生,参考本文可以快速上手,完成常见数据转存的工作。 这里给出了适合一般场景…
业务系统产生的明细数据通常要经过加工处理,按照一定逻辑计算成需要的结果,用以支持企业的经营活动。这类数据加工任务一般会有很多个,需要批量完成计算,在银行和保险…
目标任务 用户事件表T结构和部分数据示例如下: Time UserID EventType OS Browser ProductID … f1 f2 f3 f4 f5 … 2022/6/1 1 ..
目标任务 用户事件表T结构和部分数据示例如下: Time UserID EventType … 2022/6/1 10:20 1072755 Search … 2022/6/1 12:12 1 ..
目标任务 用户事件表T结构和部分数据示例如下: Time UserID EventType OS Browser … f1 f2 f3 f4 f5 … 2022/6/1 10:20 10727 ..
开源分析数据库 ClickHouse 以快著称,真的如此吗?我们通过对比测试来验证一下。 ClickHouse vs Oracle 先用 ClickHouse(简称 CH)、Oracle 数据 ..
目标任务 用户事件表T结构和部分数据示例如下: Time UserID ProductID Quantity … 2022/6/1 10:20 1072755 1 7 … 2022/6/1 1 ..
用户画像分析需要使用众多标签来描述用户属性,通常有两类标签。一类用户标签的值可能有多个,比如用户学历是中学、大学、研究生、博士等,年龄段是 children、juvenile、…
目标任务 用户事件表T结构和部分数据示例如下: Time UserID EventTypeID ProductID Quantity 2022/6/1 10:20 1072755 3 1000 ..
高并发帐户查询的应用场景有很多,例如:手机银行查流水、电商系统查购物订单、手游帐户查充值记录等等。这些场景一般会涉及众多帐户,数据总量非常大,需要外存。每个帐…
目标任务 用户事件表T结构和部分数据示例如下: Time UserID EventTypeID EventType Product Quantity Unit Price … 2022/6/1 ..
目标任务 用户事件表T结构和部分数据示例如下: Time UserID EventTypeID EventType 2022/6/1 10:20 1072755 3 Search 2022/6 ..
目标任务 用户事件表T结构和部分数据示例如下: Time UserID EventType 2022/6/1 10:20 1072755 Search 2022/6/1 12:12 10780 ..
用户分析(或帐户分析),是指对用户、帐户明细数据进行统计分析计算。常见的有:用户行为分析、银行帐户统计、漏斗转化率、保险单分析等等。 这类场景涉及众多用户的历史…
依据用户、帐户明细数据做统计分析的场景比较常见。比如:用户行为分析、银行帐户统计、漏斗转化率、保险单分析等等,我们统称为帐户分析。这类场景的特征是:总数据量巨…
很多数据仓库产品都采用了列式存储。如果数据表的总列数很多而计算涉及的列很少,采用列存就只读取需要的列即可,能够减少硬盘访问量,提高性能。特别是数据量非常大时,…
与以磁盘存储为主的普通数据库相比,内存数据库的数据访问速度可以高出几个数量级,能大幅提高运算性能,更适合高并发、低延时的业务场景。 不过,当前大部分内存数据库仍…
JOIN 一直是数据库性能优化的老大难问题,本来挺快的查询,一旦涉及了几个 JOIN,性能就会陡降。而且,参与 JOIN 的表越大越多,性能就越难提上来。 其实,让 JOIN 跑得快…
部分预汇总 多维分析后台的运算本质是分组汇总,可以直接对数据执行这个计算。但是,当数据量非常大的时候,很难做到即时响应。 预汇总是个容易想到的办法,即事先把各种…
大数据表关联时,有时会先对关联表做条件过滤。对于关联字段是主键或者部分主键的情况,SPL 在有序归并关联算法(参考这里)的基础上提供关联定位算法,来提升过滤后关联…
在大数据表关联场景中,如果各个表按照主键或部分主键关联,我们可以采用 SPL 附表机制来做性能优化。 附表机制是将上述要关联的表绑在一起存储。以客户表 customer 和联…
大表关联常常会出现性能问题。对于关联字段是主键或者部分主键的情况,SPL 提供有序归并算法来计算。 有序关联算法,要事先把这些关联表的数据按其主键排序。排序的成本虽…