3.1 时间有序存储
一般业务数据都有发生时间属性,当时间跨度比较长时,查询统计往往需要先按时间段过滤。数据以时间有序存储时可以提升过滤速度。
3.1.1 集文件
存量数据:将数据读出时按时间排序,然后写入二进制文件
A | |
---|---|
1 | =file(“ShipVia.btx”).import@bi() |
2 | =file(“Orders.txt”).cursor@mt(CustomerID:string, OrderDate:datetime, ProductID:string, Quantity:int, Unit:string, Price:decimal, Amount:decimal, EmployeeID:int,EmployeeName:string,ShipVia:string).run(OrderDate=days@o(OrderDate), ShipVia=A1.pos@b(ShipVia)).sortx(OrderDate;1000000) |
3 | =file(“Orders_Time.btx”).export@b(A2) |
A1 读取 Orders 表的数据时按时间排序
增量数据:一般单独一个文件存储,这里假设是 Orders_add.txt
A | |
---|---|
1 | =file(“ShipVia.btx”).import@bi() |
2 | =file(“Orders_add.txt”).cursor@t(CustomerID:string, OrderDate:datetime, ProductID:string, Quantity:int, Unit:string, Price:decimal, Amount:decimal, EmployeeID:int, EmployeeName:string, ShipVia:string).run(OrderDate=days@o(OrderDate), ShipVia=A1.pos@b(ShipVia)).sortx(OrderDate;1000000) |
3 | =file(“Orders_Time.btx”).export@ba(A2) |
A2 读取增量数据文件,按 OrderDate 排序
A3 将 A2 中的数据通过游标读出追加到 Orders.btx 集文件中。由于本例按 OrderDate 排序,增量部分天然是后序时间产生的订单,所以不需要考虑和原文件合并排序的问题,直接追加即可。
3.1.2 组表
组表按块存储,每一块会保存维字段的最大最小值(minmax 索引)。对于针对维字段的过滤条件,可以迅速跳过没有符合条件的块。
有序存储还能进一步提升压缩率以减少外存访问量。
存量数据:将数据读出时按时间排序,然后写入组表文件
A | |
---|---|
1 | =file(“ShipVia.btx”).import@bi() |
2 | =file(“Orders.txt”).cursor@mt(OrderDate:datetime, CustomerID:string, ProductID:string, Quantity:int, Unit:string, Price:decimal, Amount:decimal, EmployeeID:int,EmployeeName:string,ShipVia:string).run(OrderDate=days@o(OrderDate), ShipVia=A1.pos@b(ShipVia)).sortx(OrderDate;1000000) |
3 | =file(“Orders_Time.ctx”).create@y(#OrderDate, CustomerID, ProductID, Quantity, Unit, Price, Amount, EmployeeID,EmployeeName,ShipVia) |
4 | =A3.append(A2) |
5 | >A3.close() |
A2 数据按 OrderDate 排序
A3 create() 产生组表文件的结构时,指定 #OrderDate 表示以 OrderDate 作为维字段有序存储。#OrderDate 必须写在前面,所以相应地,A2 也需要调整字段顺序,把 OrderDate 写到前面
增量数据
A | |
---|---|
1 | =file(“ShipVia.btx”).import@bi() |
2 | =file(“Orders_add.txt”).cursor@mt(OrderDate:datetime, CustomerID:string, ProductID:string, Quantity:int, Unit:string, Price:decimal, Amount:decimal, EmployeeID:int, EmployeeName:string, ShipVia:string).run(OrderDate=days@o(OrderDate), ShipVia=A1.pos@b(ShipVia)).sortx(OrderDate;1000000) |
3 | =file(“Orders_Time.ctx”).open() |
4 | =A3.append(A2) |
5 | >A3.close() |
A2 读取增量数据文件,按 OrderDate 排序
A4 将 A2 中的数据通过游标读出追加到 Orders_Time.ctx 组表文件中。由于本例按 OrderDate 排序,增量部分天然是后序时间产生的订单,所以不需要考虑和原文件合并排序的问题,直接追加即可