本文将 OpenMLDB SQL 的次要应用形式(SELECT 查问语句)与规范 SQL(以 MySQL 反对的语法为例)进行比拟,让有 SQL 应用教训的开发者疾速上手 OpenMLDB SQL。
面向 OpenMLDB 版本:>= v0.7.1
反对总览
下表依据 SELECT 语句元素对 OpenMLDB SQL 在三种执行模式下(对于执行模式参考 应用流程和执行模式 — OpenMLDB documentation)与规范 SQL 整体性的差别做了汇总。OpenMLDB SQL 目前局部兼容规范 SQL,但思考理论业务场景需要新增了局部语法,下表加粗局部为新增语法。
注:✓ 示意 反对 该语句,✕ 示意 不反对。
差别详解
差别维度
与规范 SQL 比拟,OpenMLDB SQL 的差异性次要会从三个维度进行阐明:
- 执行模式:在三种不同执行模式下(离线模式,在线预览模式,在线申请模式),不同的 SQL 的反对水平不一样,须要离开考查。广泛的,为了最终能够让 SQL 实现实时计算,最终须要上线的业务 SQL 须要合乎在线申请模式的要求。
-
子句组合:不同子句的组合会带来额定的限度,下文形容模式 A 利用于 B,示意 A 子句在 B 子句的后果上运行。比方 LIMIT 利用于 WHERE,则其 SQL 相似为:
SELECT * FROM (SELECT * FROM t1 WHERE id >= 2) LIMIT 2
。- 下文中的“表援用”是指
FROM TableRef
,不是 subquery 也不是带有 join/union 的简单 FROM 子句。
- 下文中的“表援用”是指
- 非凡限度:不归于以上两类的非凡限度,会进行独自阐明,个别是因为性能反对不欠缺或者程序已知问题所引起。
扫描限度的配置
为了防止用户误操作而影响到在线性能,OpenMLDB 有相干参数来限度在离线模式和在线预览模式下的全表扫描次数。如果关上了这些参数的限度,将会导致局部波及到多个记录扫描的操作(比方 SELECT *, 聚合操作等)可能呈现后果截断,而最终产生谬误后果。留神,这些参数不会影响到在线申请模式的后果正确性。
相干参数会在 tablet 配置文件 conf/tablet.flags 里进行配置,详见文档 配置文件 — OpenMLDB documentation。影响到扫描限度的参数为:
- 最大扫描条数
--max_traverse_cnt
- 最大扫描 key 的个数
--max_traverse_pk_cnt
- 返回的后果大小限度
--scan_max_bytes_size
预计在 v0.7.3 以及当前版本中,以上参数的默认值都为 0,即不做相干限度。之前的版本须要留神相干参数的设置。
WHERE 子句
LIMIT 子句
前面跟一个 INT literal, 不反对其它表达式,示意返回数据的最大行数。LIMIT 不反对上线。
WINDOW 子句
WINDOW 子句和 GROUP BY & HAVING 子句不反对同时应用。上线时 WINDOW 的输出表必须是物理表或者对物理表的简略列筛选和 last join 拼接(简略列筛选为 select list 只有列援用或者列的重命名,没有其它表达式),具体反对参照下表,未列出状况均为不反对。
非凡限度:
- 在线申请模式下,WINDOW 的输出是 LAST JOIN 或者子查问内的 LAST JOIN, 留神窗口的定义里 partition by & order by 的列都必须来自 JOIN 最右边的表。
GROUP BY & HAVING 子句
GROUP BY 语句,目前仍为试验性功能,仅反对输出表是一张物理表,其它状况不反对。GROUP BY 不反对上线。
JOIN 子句(LAST JOIN)
OpenMLDB 仅反对 LAST JOIN 一种 JOIN 语法,详细描述参考扩大语法的 LAST JOIN 局部。JOIN 有左右两个输出,在线申请模式下,反对两个输出为物理表,或者特定的子查问,详见表格,未列出状况不反对。
非凡限度:
- 对于特定子查问的 LAST JOIN 上线,还有额定要求,详见上线要求。
- 在线预览模式下不反对 LAST JOIN, 见 issue https://github.com/4paradigm/…。
WITH 子句
OpenMLDB (>= v0.7.2) 反对非递归的 WITH 子句。WITH 子句等价于其它子句利用于子查问时的语义,WITH 语句的反对状况,可参照其对应子查问写法下,上述表格的阐明。
非凡限度:
- 无
聚合函数
聚合函数可利用于全表或窗口。三种模式下均反对窗口聚合查问;全表聚合查问仅在在线预览模式下反对,离线和在线申请模式不反对。
非凡限度:
- OpenMLDB v0.6.0 开始反对在线预览模式的全表聚合,但留神所形容的 扫描限度配置。
- OpenMLDB 有本人的聚合函数列表,请查看产品文档具体查问所反对的函数 OpenMLDB 内置函数。
扩大语法
OpenMLDB 次要对 WINDOW 以及 LAST JOIN 语句进行了深度定制化开发,本节将对这两个语法进行具体阐明。
WINDOW 子句
在 OpenMLDB 里应用到的一个典型的 WINDOW 语句个别会蕴含以下元素:
- 数据定义:通过
PARTITION BY
定义窗口内数据 - 数据排序:通过
ORDER BY
定义窗口内数据排序 - 范畴定义:通过
PRECEDING
,CURRENT ROW
,UNBOUNDED
定义工夫延展方向 - 范畴单位:通过
ROWS
,ROWS_RANGE
定义窗口滑动范畴的单位 - 窗口属性:OpenMLDB 特有的窗口属性定义,包含
MAXSIZE
,EXECLUDE CURRENT_ROW
,EXCLUDE CURRENT_TIME
,INSTANCE_NOT_IN_WINDOW
- 多表定义:通过扩大语法
WINDOW ... UNION
定义是否须要进行跨表数据源拼接
对于 WINDOW 具体语法,请参考 WINDOW 文档。
非凡限度
- 在线预览模式或者离线模式下,WINDOW 的输出是 LIMIT 或者 WHERE 子句,失去的计算结果可能不正确, 不倡议应用。
窗口定义举例
- 定义 ROWS 类型窗口,窗口范畴是前 1000 行到以后行:
SELECT sum(col2) OVER w1 as w1_col2_sum FROM t1WINDOW w1 AS (PARTITION BY col1 ORDER BY col5 ROWS BETWEEN 1000 PRECEDING AND CURRENT ROW);
- 定义 ROWS_RANGE 类型窗口,窗口范畴是以后行前 10 秒的所有行,以及以后行:
SELECT sum(col2) OVER w1 as w1_col2_sum FROM t1WINDOW w1 AS (PARTITION BY col1 ORDER BY col5 ROWS_RANGE BETWEEN 10s PRECEDING AND CURRENT ROW);
- 定义一个 ROWS 类型窗口,窗口范畴是前 1000 行到以后行。除了以后行以外窗口内不蕴含以后时刻的其余数据:
SELECT sum(col2) OVER w1 as w1_col2_sum FROM t1 WINDOW w1 AS (PARTITION BY col1 ORDER BY col5 ROWS BETWEEN 1000 PRECEDING AND CURRENT ROW EXCLUDE CURRENT_TIME);
- 定义一个 ROWS_RANGE 类型窗口,窗口范畴为以后工夫到过来 10 秒,然而不蕴含以后申请行:
SELECT sum(col2) OVER w1 as w1_col2_sum FROM t1 WINDOW w1 AS (PARTITION BY col1 ORDER BY col5 ROWS_RANGE BETWEEN 10s PRECEDING AND CURRENT ROW EXCLUDE CURRENT_ROW);
- 匿名窗口:
SELECT id, pk1, col1, std_ts,sum(col1) OVER (PARTITION BY pk1 ORDER BY std_ts ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) as w1_col1_sumfrom t1;
WINDOW … UNION 举例
在理论开发中,较多的利用的数据是寄存在多个表格中,在这种状况下,个别会应用 WINDOW … UNION 的语法进行跨表的聚合操作。请参考教程 跨表特色开发教程
LAST JOIN 子句
对于 LAST JOIN 具体语法标准,请参考 LAST JOIN 文档。
LAST JOIN 举例
SELECT * from t1 LAST JOIN t2 ON t1.col1 = t2.col1;
理解更多
如果想进一步理解 OpenMLDB 或者参加社区技术交换,能够通过以下渠道取得相干信息和互动。
OpenMLDB GitHub 主页
https://github.com/4paradigm/…
OpenMLDB 微信交换群