SPL关联优化技巧

1。小维表

用SPL进行关联,当维表不大时可以读入内存。

1.1单字段主键

如果维表是单字段主键,可以使用开关做连接,例如有订单,客户,雇员三个表存储在集文件中,表结构如下:

OrderCustomerEmployeeorderIDcustomerIDemployeeIDcustomerIDnamenameemployeeIDCitytitle…………国家

……


现在把订单表和客户表,雇员表进行关联:


A1=文件(“order.btx”) .cursor@b() 2=文件(“customer.btx”) .import@b() 3=文件(“employee.btx”) .import@b () 4=A1。开关(customerID A2: customerID, employeeID A3: employeeID) 5=A4。新(orderID、customerID.name employeeID.name:名字)

A1:订单表数据很多,所以用游标。

A2:客户表数据少,全部装入内存,并且建立索引。

A3:同理雇员表也做维表内存化。

A4:用开关做关联,根据客户ID字段关联订单表和客户表,以及根据employeeID字段关联订单表和雇员表。

从A4可以看的到,开关可以一次处理多个关联计算。

当维表的主键是序号时还可以用序号定位。


A1=文件(“order.btx”) .cursor@b() 2=文件(“customer.btx”) .import@b () .index() 3=文件(“employee.btx”) .import@b () 4=A1。开关(customerID A2: customerID;employeeID D, A3: #) 5=A4。新(orderID、customerID.name employeeID.name:名字)

A5:雇员表的employeeID字段是从1开始的自然数,所以可以做外键序号化。

如果维表的主键不是序号值,就无法直接使用外键序号化进行性能优化。比如customerID字段的值就是由字母构成的。这时,可以把维表的主键转换成序号后再使用外键序号化。

首先把客户表的客户ID转换为序号:


A1=文件(“customer.btx”) .import@b () 2=A1.derive (#: newCustomerID) 3=文件(“newAndOldCustomerID.btx”) .export@b (A2、newCustomerID customerID) 4=文件(“newCustomer.btx”)。export@b (A2, newCustomerID: customerID,名称、市)

序号化后的客户保存到了集文件newCustomer.btx中。其中newAndOldCustomerID。btx里保存的是新旧客户ID的对应关系。

然后再把订单表的customerID进行序号化:


A1=文件(“newAndOldCustomerID.btx”) .import@b() 2=文件(“order.btx”) .cursor@b () 3=A2。开关(customerID, A1: customerID) 4=A3.run (customerID。newCustomerID: customerID) 5=文件(“newOrder.btx”) .export@ba (A4)

序号化后的订单保存到了集文件订单。btx中。

这时对于customerID字段,也可以通过序号化进行连接了。


A1=连接(“演示”)2=文件(“newOrder.btx”) .cursor@b() 3=文件(“newCustomer.btx”) .import@b() 4=文件(“employee.btx”) .import@b () 5=A2.switch (customerID, A3: #;employeeID A4: #) 6=A5。新(orderID、customerID.name employeeID.name:名字)

1.2多字段主键

当维表的主键是多个字段的时候,要使用加入做连接,例如有学生表(学生)和班级表(类),学生表的专业号和班级号为外键字段,分别指向班级表的联合主键(专业号,班级号),表结构如下:

StudentClassstudentIdmajorIdnameclassIdmajorIdteacherclassId

现在要查询学生的学号,姓名,专业,班级和班主任:


A1=文件(“student.btx”) .import@b() 2=文件(“class.btx”) .import@b () . keys (majorId classId) 3=A1.join (majorId: classId A2老师)

A2:导入班级数据,并且设置主键为majorId和classId;

A3:加入()函数进行双字段的主键关联,将班主任信息添加到学生信息中。

2。大维表

如果维表无法装入内存,而事实表可以装入内存,则可以使用joinx函数进行关联。此时维表要按主键有序存储,可分段集文件或组表均可,后者效率更高。

例如有退货表,产品表两个表存储在集文件中,表结构如下:

ReturnsProductorderIDproductIDproductIDnamepricepricequantitycategorydate…………

这里退货表对关联字段producID是无序的,产品表是按照producID字段有序的。计算目标是获得每一笔退货记录的产品类别,需要把退货表和产品表做关联:


A1=文件(“returns.btx”) .import@b()文件(“product.btx”) 2=3=A1。joinx@q (productID A2: productID categroy: categroy;) 4=A3.fetch ()

A1:把退货表装入内存;

A2:给出产品表的文件对象,

A3:使用joinx函数进行关联。

如果事实表对关联字段也是有序的,就可以加上@c,进一步提速,例如计算每一笔退货记录的客户ID,就要把退货表和订单表做关联:


A1=文件(“returns.btx”) .import@b()文件(“order.btx”) 2=3=A1。joinx@qc (orderID A2: orderID customerID: customerID;) 4=A3.fetch ()

实际上,上面两个例子可以一次完成:

SPL关联优化技巧