3.2 有序过滤

3.2.1 集文件

SQL

SELECT count (DISTINCT CustomerID) iNum,count(1) Num,EmployeeID,EmployeeName
FROM Orders
WHERE OrderDate>='2022-03-15' and OrderDate<='2022-06-16' and Amount>1000
GROUP BY EmployeeID,EmployeeName
ORDER BY EmployeeID

SPL

A
1 >st=date(“2022-03-15”), et=date(“2022-06-16”), start=days@o(st), end=days@o(et)
2 =file(“Orders_Time.btx”).iselect@br(start:end,OrderDate; EmployeeID, EmployeeName, CustomerID,Amount).select(Amount>1000).groups(EmployeeID; EmployeeName, count(1):Num, icount(CustomerID):iNum)

A2 iselect 表示从对 OrderDate 有序的文件读出 OrderDate 在 [start,end] 区间的记录构成游标,此时区间是闭区间,@r 选项表示 OrderDate 取值不唯一。
iselect 不能同时使用并行选项,在单任务场景时,如果选出结果集较大,不一定会比采用并行后的全遍历更快。但在多任务场景时,通常也不能使用并行(多 CPU 要用于处理并发),iselect 就会有较大优势。
由于数据是按时间有序的,所以 Amount>1000 不能写到 iselect 里面,只能在外面再用 select 过滤。由于 iselect 结果集已经比较小了,所以对性能的影响不大。

3.2.2 组表

SQL

SELECT count (DISTINCT CustomerID) iNum,count(1) Num,EmployeeID,EmployeeName
FROM Orders
WHERE OrderDate>='2022-03-15' and OrderDate<='2022-06-16' and Amount>1000
GROUP BY EmployeeID,EmployeeName
ORDER BY EmployeeID

SPL

A
1 >st=date(“2022-03-15”), et=date(“2022-06-16”), start=days@o(st), end=days@o(et)
2 =file(“Orders_Time.ctx”).open().cursor@mx(OrderDate,CustomerID,EmployeeID,EmployeeName;OrderDate>=start && OrderDate<=end && Amount>1000)
3 =A2.groups(EmployeeID; EmployeeName, count(1):Num, icount(CustomerID):iNum)

A2 从组表文件中读取满足时间段的数据,@m 表示并行
过滤时把条件写到 cursor()里面,将会自动处理维字段实施跳块动作,不满足条件的数据块会被直接跳过。如果写成 cursor().select(…),则不会实施跳块动作,所有数据块都会被扫描。
和前述的集文件不同,组表则可以把 Amount>1000 写到 cursor 里面,和时间的过滤条件写到一起,在实施完跳块动作后,遍历块内数据时自动会识别并执行过滤。