关于数据库:OpenMLDB-SQL-与标准-SQL-的主要差异

38次阅读

共计 3427 个字符,预计需要花费 9 分钟才能阅读完成。

本文将 OpenMLDB SQL 的次要应用形式(SELECT 查问语句)与规范 SQL(以 MySQL 反对的语法为例)进行比拟,让有 SQL 应用教训的开发者疾速上手 OpenMLDB SQL。

面向 OpenMLDB 版本:>= v0.7.1

反对总览

下表依据 SELECT 语句元素对 OpenMLDB SQL 在三种执行模式下(对于执行模式参考 应用流程和执行模式 — OpenMLDB documentation)与规范 SQL 整体性的差别做了汇总。OpenMLDB SQL 目前局部兼容规范 SQL,但思考理论业务场景需要新增了局部语法,下表加粗局部为新增语法。
注:✓ 示意 反对 该语句,✕ 示意 不反对

差别详解

差别维度

与规范 SQL 比拟,OpenMLDB SQL 的差异性次要会从三个维度进行阐明:

  1. 执行模式:在三种不同执行模式下(离线模式,在线预览模式,在线申请模式),不同的 SQL 的反对水平不一样,须要离开考查。广泛的,为了最终能够让 SQL 实现实时计算,最终须要上线的业务 SQL 须要合乎在线申请模式的要求。
  2. 子句组合:不同子句的组合会带来额定的限度,下文形容模式 A 利用于 B,示意 A 子句在 B 子句的后果上运行。比方 LIMIT 利用于 WHERE,则其 SQL 相似为:SELECT * FROM (SELECT * FROM t1 WHERE id >= 2) LIMIT 2

    1. 下文中的“表援用”是指FROM TableRef,不是 subquery 也不是带有 join/union 的简单 FROM 子句。
  3. 非凡限度:不归于以上两类的非凡限度,会进行独自阐明,个别是因为性能反对不欠缺或者程序已知问题所引起。

扫描限度的配置

为了防止用户误操作而影响到在线性能,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 子句,失去的计算结果可能不正确, 不倡议应用。

窗口定义举例

  1. 定义 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);
  1. 定义 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);
  1. 定义一个 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);
  1. 定义一个 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);
  1. 匿名窗口:
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 微信交换群

正文完
 0