(已解决) 关于组表 T.cursor(x:C,...;) 中 x 表达式的疑问

😄 两个疑问:
1、x 表达式能不能直接用函数处理,甚至是字段之间的运算后得到一个新字段;
2、如果后续计算中要用到字段之间的运算,可不可以先在 cursor 处完成,对效率有没有积极影响?比如,有数量, 单价和折扣 3 个字段,先在 cursor 中计算得到新字段: 数量×单价×(1- 折扣)
这样写就免去了后续计算中对这个值的重复计算,当然也有其他途径避免重复计算。

对于第 1 个疑问,根据文档说明,T.cursor(x:C,…;) 中参数 x 是表达式,缺省时返回 T 中的所有字段。我的理解是 x 表达式既可以直接写字段名,也可以是字段进行计算后得到的 x,比如数值字段的加减乘除,文本字段的文本处理,或者是字段之间的运算…等等,应该都属于表达式。我就好奇做了些测试,如下所示:

1、对组表文件中的文本型字段 L_SHIPMODE 用 sbs 函数截取,结果符合预期。

imagepng

此时,若换成 mid/left/right 就报错了,不能识别字段,如下所示:

imagepng

既然不能识别字段,那把字段先获取出来,再处理,也就是写两遍,结果符合预期,如下:

imagepng

跟第一种情况的区别就是,sbs 能直接处理字段,而其他一些函数不能直接处理字段,须把字段先获取出来,再去处理。

2、再来看看数值型字段的处理情况,比如,对数值型字段 L_DISCOUNT 直接乘以 10,报错了:

imagepng

把 L_DISCOUNT 先写出来,再写一遍乘以 10,返回结果符合预期:

imagepng

此时,再把乘法换成加法,报错了:

imagepng

如果把加法换成 sum(字段,10),不会报错:

imagepng

再来试试减法,减法可以返回预期结果:

imagepng

那上述加上 10 报错,变成减去 -10 行不行,结果返回正确:

imagepng

只要是乘除减都可以,唯独加法不行,加上负数也报错:

imagepng

第 2 个疑问,是在学习 性能优化案例课程 TPCH-Q1 时想到的,文中第 7 部分有如下描述,

imagepng

代码中 L_EXTENDEDPRICE*(1-L_DISCOUNT) 这部分是在后续 groups 聚合计算时算的,赋值给了变量 dp。我就在想,如果把这部分移到上一步获取数据时在 T.cursor() 中直接得到一个新字段 dp,会不会对效率有积极影响,在测试过程中碰到了本帖求助的这些问题,有点困惑:

能不能直接对字段处理,甚至是字段之间的直接运算,不用先把字段写出来,再写一遍计算;
在 cursor 处运算得到一个新字段,会不会影响效率,我自己测试看不出名堂,好像快一些,又好像没啥区别。

帖子中用到的 ctx 文件是 TPCH 的测试文件,应该能弄到,或者可以通过以下途径得到:

1、 用 SPL 生成 TPCH 数据

2、 https://pan.baidu.com/s/1RIo8JqQqD8-STyNNYt5ADA?pwd=spl6

恳请大佬们得闲时给予指导解惑🙏