使用 SQL+ 操作流程

 

业务需求

客户数据库存储过程代码较多,跑批时间过长,严重影响业务发展,拟采用集算器实现优化、提速;
因用户实际业务中使用 SQL 是主流的语法,鉴于 SPL 需要系统学习,学习成本较高,为了快速的将 SQL 转化为 SPL, 故使用 SQL+ 作为桥梁, 让习惯 SQL 的用户逐渐也能习惯 SPL 的解决办法,本文将介绍 SQL 改写 SQL+ 生成 SPL 的一些基本操作步骤如下:

一.SQL 改写 SQL+

第一步:SQL 预处理(手工完成)

(1)字段 (+) 的连接要写成 join…on…的写法,举例:SELECT * from table1 A,table2 B where 1=1 and A.ID=B.ID(+) 需要改写成 SELECT * from table1 A left join table2 B on A.ID=B.ID where 1=1。

(2)From 中临时表子查询 select 部分需要别名,举例: SELECT * from table1 A left join (select ID,NAMEfrom table2 B) C on A.ID=C.ID 需要改写成 SELECT * from table1 A left join (select ID as ID ,NAME as NAME from table2 B) C on A.ID=C.ID

(3) 需要转换成 SPL 的 SQL+ 中所有的子查询 from table A 的别名不能一致。

(4) 窗口函数不支持,SQL+ 中需要把窗口函数改写,SPL 手动加上窗口函数。

(5)Select 中子查询不支持多层子查询 举例:SELECT (SELECT name from table1 A where id in (select id from table2 B where B.EID=C.EID) ) as name from ta 处理窗口函数逻辑 ble3 C 这样的写法不支持需要改写。

(6)SQL+ 存在 union all 可以正常转换,限制条件要么左右有序,要么内存化、

(7)SQL 中–和 /**/ 的注释需要去掉。

(8) 需要明确 from 表间关系,确定关联字段是否是主键或联合主键。

(9)SQL 结尾不能用“;”。

第二步:SQL+ 标记(手工完成)

(1)/*+parallel (n) */ T  生成并行多路游标。

(2)/*+external */ T 该表不可内存,要用游标和直接文件处理,缺省是内存表。

(3)/*+primary */ join 同维 / 主子,两表都有序,可非内存,表间关系一对一。

(4)/*+foreign */ join 外键关联,右表外存时假定其有序,表间关系多对一(注:一对多不可以)。

(5)/*+group */ inin 判断要转 join 时,先做 group。

(6)/*+group */ existsexists 判断要转 join 时,先做 group。

(7)T /* +ctx*/ /*+btx */ 表来自组表 / 集文件,加上后缀在主目录找,只要标记一次;select * from table / *+btx */ b 在集算器主目录找 table.btx 文件。

(8)left join/join /*+order */ 有外存表时,将右边先按关联键排序(注:内存表 order 标记不生效)。

(9)/*+var(v) */(…) 定义成变量 v。

(10)(…)/*+var(v) */ 使用变量 v,忽略 (…) 内容。

二.SQL+ 生成 SPL

第一步:SPL 转换(自动完成)

集算器 SQL+ 转 SPL 目前使用的授权需要有“内部测试”的功能。

第二步:检查 SPL 比对数据(手动完成)

(1) 被转换的 SPL 如果有 func 多半是有问题的,会出现注释的提示告诉你需要手动改。

(2) 被转换的 SPL 出现找不到文件的情况,检查 SQL+ from table 是否有打标记,集算器主目录下是否能找到数据文件(集文件,组表)。

(3)SELECT * From table1 /* +btx*/ A /* +primary*/ left join table2 /* +btx*/ B on A.ID=B.ID 转换之后的SPL 对应join@1m,@m 假定所有Ai针对xj,…有序,则用归并法计算;如数据对不上优先检查左右俩表字段排序问题。

(4)SELECT * From table1 /* +btx*/ A /* +foreign*/ left join table2 /* +btx*/ B on A.ID=B.ID 转换之后的SPL对应join@1 ;不需要排序。

(5)SELECT * From /* +external*/ table1 /* +ctx*/ A /* +primary*/ left join /* +external*/ table2 /* +ctx*/ B on A.ID=B.ID 转化之后的 SPL 对应 joinx@1;数据存在问题看左右表排序情况。

(6)SELECT * From /* +external*/ table1 /* +ctx*/ A /* +foreign*/ left join /* +external*/ table2 /* +ctx*/ B on A.ID=B.ID 转化之后的 SPL 对应 cs.joinx@1;数据存在问题看右表 table2 排序情况。

(7)SELECT * From /* +external*/ table1 /* +ctx*/ A /* +foreign*/  join  table2 /* +btx*/ B on A.ID=B.ID 转化之后的 SPL 对应 joinx@u;join 左右关联字段不需要排序。

(8)SPL 中如果出现注释的情况,检查看数据库函数(例如:to_date,to_char,add_months,trunc 等)是否转换成功。

(9) 将 SPL 最终的结果数据导出到文件,和数据库存储过程结果数据作对比,进行核对。