SPL 和 SQL 能不能融合在一起?

news2024/11/24 8:09:18

文章目录

    • SPL 和 SQL 能不能融合在一起?
    • SPL资料

SPL 和 SQL 能不能融合在一起?

SQL和SPL都是面向结构化数据的通用处理技术。SQL普及率高受众广,很多用户天生就会用SQL查询数据,如果数据引擎支持SQL就会很容易上手,而且历史程序也相对容易迁移;SPL则具备简洁高效的特点,提供了更加敏捷的语法可以简化复杂计算,同时支持过程计算天然支持分步编码,计算体系更加开放可以同时针对多种数据源混合计算,利用内置的高性能存储和高性能算法容易获得更高的计算性能,在使用时更加灵活既可以独立使用也可以嵌入应用集成使用。

那么在实际应用中能否在一个数据运算体系中将SQL和SPL融合使用,根据不同场景分别使用不同的技术,以便发挥各自的优势呢?

要回答这个问题我们要从几方面来讲。

先看在已经支持SQL的数据库上是否能提供对SPL的支持。

原则上,所有的关系数据库都可以作为SPL的数据源,SPL通过数据库提供的接口读取数据进行计算,读取数据时仍然使用SQL但后续计算完全由SPL完成。这虽然与使用SQL直接在数据库内计算不同,但对应用来讲只是计算的实施位置不同,对于应用请求和使用数据并没有太大区别,因此从这个角度来讲二者可以很好融合在一起使用。

但是,我们还要回答为什么要在SQL的基础上增加SPL?肯定是要解决某些问题。

如果是功能性的需求,那没问题。有些计算用SQL很难写甚至写不出,用SPL可以简化计算。比如计算一支股票最长连续上涨了多少天?用 SQL 写出来很绕:

select max (consecutive_day)
from (select count(*) (consecutive_day
      from (select sum(rise_mark) over(order by trade_date) days_no_gain
            from (select trade_date,
                         case when closing_price>lag(closing_price) over(order by trade_date)
                              then 0 else 1 END rise_mark
                  from stock_price ) )
      group by days_no_gain)

这样的语句难写难懂又难调试,在实际业务中经常会混在多步的复杂过程中,加大开发和维护难度。而读出来再用SPL计算就简单多了:

db.query("select closing_price from stock_price order by trade_date").group@i(closing_price<closing_price[-1]).max(~.len())

而且很容易调试,大大降低开发维护成本。

借助SPL的敏捷语法和过程计算等特性经常能大幅简化算法实现难度。所以, SPL可以作为SQL的很好补充。而且SPL提供了JDBC接口,完全可以封装成和使用数据库一样。

imagepng

但是,如果要解决的是性能问题就没这么简单了,对于功能已经稳定的存量系统面临的绝大多数问题可能都是性能问题,引入SPL就是要来提速的。SPL中有丰富的高性能算法类库,是否可以用在这里提高性能呢?

非常遗憾,大概率不可以!我们很难在现有数据库(SQL体系)上使用SPL来提高性能。原因在于数据存储,即数据组织形式。

我们知道高性能算法和数据存储密切相关,SPL也不例外。想要充分发挥SPL高性能算法的效力就需要将数据按照一定形式来组织。比如SPL的单边分堆算法就要求数据有序存储;有序归并也要求数据按照关联键有序;外键序号化则需要事先将外键值改造成维表的序号再使用;…… 类似的情况还有很多,要实施高性能算法就必须有存储做基础,而数据库的存储对外不透明没法干预,想要根据计算特征调整存储更做不到,基于数据库的存储通常也就无法再利用SPL中的算法实现高性能计算了。

在现有数据库体系上融合SQL和SPL要看实际需要,SPL能基于SQL数据库工作,但获得不了高性能。


那么,能不能反过来,在SPL中提供SQL支持呢?即在一个体系之内提供两种查询语法。

目前SPL的确提供了一定的SQL支持,称之为简单SQL。在SPL内部可以使用简单SQL查询文本、NoSQL、WebService等多种数据源,支持过滤、关联、子查询等操作(与SQL92标准相当),对于熟悉SQL的小伙伴使用起来也会比较方便。比如可以在SPL内嵌入:

select e.Dept,sum(o.Amount) from d:/Orders.csv o
left join d:/Employees.xlsx e on o.SellerId=e.Eid
group by e.Dept

来实现文件上的运算。

但是,这种用法仍然无法保证高性能,而且只能支持相对简单的场景,比如只能针对小数据集查询。出现这个现象的原因有两方面,一方面是SPL团队不是专业的SQL实现者,不容易做出非常完善且高效的SQL;另一方面SQL本身存在一些限制导致技术上很难再向上突破,因此也没有太大意愿继续完善SQL。

那能不能将SQL自动转化成SPL呢?应用/使用者负责生成SQL交给SPL,SPL将接收到的SQL进行翻译从而转化成SPL原生语法再执行。

理论上来讲,SPL是SQL的超集,任何SQL实现的计算的确都可以使用SPL来完成,解释或移植 SQL 是可能的,虽然这也有不少工作量,但难度并不是非常大。不过,这样做只能获得语法的兼容性,仍然不能得到高性能。SQL本身就存在实现高性能算法的限制,由于缺乏一些关键的数据类型(如记录类型)和基本运算(如有序计算)导致很多高性能算法都无法描述,通过很绕的方式实现往往性能就很低了,再翻译过来性能就更差,甚至大数据根本跑不了。高效的代码要针对运算模型的特征去编写,而SQL语句中通常并没这样的信息。比如TopN计算:

SELECT TOP 10 x FROM T ORDER BY x DESC

这句SQL表达出来的执行逻辑是对所有数据进行大排序,然后再取出前 10 个。大数据排序很慢,会涉及多次内外存交互,如果按照表面的意思去执行效率会很低。但传统数据库通常有很强的优化引擎,可以猜出SQL的实际意义并进行有效优化而不会按照SQL的表面意思执行。像这个TopN运算,数据库优化引擎就有办法采用避免大排序的更高效执行方式,而这种高效算法在SPL语法中也很容易实现,但是如果只是原样翻译SQL语句的执行逻辑就只能进行大排序,用不了高效算法,也就无法保证高性能了。

关系数据库诞生了几十年,数据库优化工作从未停止,这些能力需要丰富的经验和长时间的不断投入才能完成。相比之下,SPL团队的这个能力远远不如传统数据库厂商,基本做不了这事,如果要做翻译,通常也只能硬搬SQL的执行逻辑,那性能就会非常低下。这个任务,只能等SPL普及较多后,由传统数据库厂商利用自己的经验来做。

那么在实际应用中,SQL和SPL该如何分工呢?

OLTP业务目前使用SQL还是相对必须的(SPL的OLTP功能还在路上),使用SPL做分析需要先将业务数据(通常是冷数据)同步到SPL存储中再使用,这样就可以获得高性能。同时借助SPL的T+0查询能力可以完成全量数据的实时查询(开源 SPL 轻松应对 T+0),还可以配合OLTP数据库实现HTAP需求(HTAP 数据库搞不定 HTAP 需求)这样就可以同时享受到SQL和SPL的便利。

对于新建的OLAP系统,可以直接使用SPL的自有存储和计算能力完成而不涉及SQL,如数据仓库、数据中台、数据湖建设等,这样不仅可以享受SPL的高性能而且SPL代码比SQL也更简单。

  • 数据中台为什么不好搞?
  • 现在的湖仓一体像是个伪命题

对于存量OLAP系统希望通过SPL提升性能时,需要根据实际场景决定,通常先是哪痛医哪,将具体问题涉及的数据转存到SPL再利用SPL的高性能计算来提速。

随着应用的深入可以将原来的SQL实现逐步迁移到SPL中实现性能优化的同时还能改善应用结构。

  • 开源 SPL 消灭数以万计的数据库中间表
  • 爱恨交加的存储过程该往何处去?
  • ETL 为什么经常变成 ELT 甚至 LET?

总的来说,在一定程度内(相对简单的情况)兼容SQL可以方便用户使用,但如果想要进一步发挥SPL的效力去解决SQL解决不了的问题时就需要基于SPL存储使用原生SPL语法完成,继续深入兼容SQL既不现实也无必要。

SPL资料

  • SPL下载
  • SPL源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】数据库约束与聚合查询和联合查询等进阶操作知识汇总

目录1.数据库约束:1.1 约束的类型:1.2 unique:1.3 primary key:1.3.1 分布式系统下,自增主键如何生成唯一id:1.4 foreign key:1.4.1 逻辑删除:2.表的设计/数据库的设计:2.1 数据库是如何设计的?3.进阶插入操作:4.进阶查询:4.1 聚合查询:4.2 group by 列名:4.3 联合查询/多表查…

2508. 添加边使所有节点度数都为偶数 c++

给你一个有 n 个节点的 无向 图&#xff0c;节点编号为 1 到 n 。再给你整数 n 和一个二维整数数组 edges &#xff0c;其中 edges[i] [ai, bi] 表示节点 ai 和 bi 之间有一条边。图不一定连通。 你可以给图中添加 至多 两条额外的边&#xff08;也可以一条边都不添加&#x…

C51——定时器控制寄存器

定时器的本质原理&#xff1a; 每经过一个一起周期&#xff0c;就加1 在寄存器里加 当我们想要操作寄存器的时候 就要找到TCON 当它开始数数的时候&#xff0c;会有天花板&#xff0c;会有溢出。 那我们怎么知道他溢出了&#xff1f;有TF0&#xff0c;当TF0 出现变化的时…

【剧前爆米花--爪哇岛寻宝】

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaSE语法与底层详解》 文章分布&#xff1a;这是一篇关于接口的文章&#xff0c;在本篇文章中我会将接口常用的一些实例进行讲解&#xff0c;以及部分方法在重写中的思想。 目录 Comparable和Comparator接口使用 Object类 t…

JDBC的简单使用与封装

目录 1、JDBC 2、JDBC的常用接口 1.Driver接口 2.Connection接口 3.Statement接口 4.ResultSet接口 3、JDBC的基本使用 1&#xff09;、简单的增删查改 Ⅰ、查 Ⅱ、增 Ⅲ、改 Ⅳ、删 2&#xff09;简单封装 1、JDBC 我们先了解JDBC是什么&#xff0c;JDBC的全称是Java数…

2018年全国职业技能大赛中职组“网络安全”赛项—基础题(解析)

2018年全国职业技能大赛中职组“网络安全”赛项—基础题&#xff08;解析&#xff09; 任务一、nmap 1、nmap sP -n 192.168.100.133 //进行ping扫描 1.1、nmap -Pn -n 192.168.100.133 //目标禁用 绕过ping 扫描 2、nmap -A -n ip // 对ip进行综合性扫描 3、nmap -O -n…

TiDB-学习笔记

编写这个笔记&#xff0c;希望能记录下学习TiDB时候的知识点。 目录 第一章 1.事务 1.1 SQL-92标准&#xff1a; 1.2 事务的隔离级别 2.在TiDB学习 SQL 语句 第二章 第三章 第一章 1.事务 事务的特性&#xff08;ACID&#xff09; atomicity原子性、consistency一致性、i…

网上花店网页代码 html静态花店网页设计制作 dw静态鲜花网页成品模板素材网页 web前端网页设计与制作 div静态网页设计

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

全志V853 在 NPU 转换 YOLO V3 模型

NPU 转换 YOLO V3 模型 YOLO 全称是 You Only Look Once&#xff08;你只需看一次&#xff09;&#xff0c;从名称上也能看出这种算法速度快的优势&#xff0c;因此在许多边缘设备上&#xff0c;YOLO 算法的使用十分广泛。YOLOV3 是华盛顿大学研究生 Joseph Redmon 所开发&…

matlab学习笔记(九)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 matlab学习笔记&#xff08;九&#xff09;一、信号采样二、信号重建一、信号采样 信号的采样原理图如下图所示&#xff1a; 其数学模型表示为&#xff1a; 其中的f(t)为原…

11、Mysql高级之SQL优化

11、Mysql高级之SQL优化 文章目录11、Mysql高级之SQL优化0 SQL优化1 大批量插入数据2 优化insert语句3 优化order by语句3.1 环境准备3.2 两种排序方式3.3 Filesort 的优化4 优化group by 语句5 优化嵌套查询6 优化OR条件7 优化分页查询7.1 优化思路一7.2 优化思路二8 使用SQL提…

【Budibase】搭建低代码开发平台

Budibase介绍 Budibase 是一套开源的低代码开发平台&#xff0c;支持一键数据库及API 接入&#xff0c;支持简单的 JS 关联前后端数据&#xff0c;有细致的权限访问管理&#xff0c;对移动端有良好的支持。它主打企业流程自动化&#xff0c;有完善的自动化流程设计&#xff0c…

NETDMIS5.0界面介绍

1.启动界面介绍 双击桌面快捷方式&#xff0c;打开NET.DMISS启动界面如下图&#xff0c;包含三个菜单是文件、设置语言、帮助。 2.工作界面介绍 默认测量界面包括主菜单&#xff0c;工具条&#xff0c;节点程序界面&#xff08;显示测量过程&#xff09;&#xff0c;CAD视窗…

(免费分享)基于ssm简易网盘系统

开发工具&#xff1a;IDEA&#xff0c;mysql5.7 Tomcat8.0&#xff0c;jdk1.8 package cn.tangtj.clouddisk.web;import cn.tangtj.clouddisk.entity.User; import cn.tangtj.clouddisk.utils.UserUtil; import org.apache.logging.log4j.LogManager; import org.apache.loggi…

嵌入式应用开发|Linux文件I/O常用的四种访问方式

在Linux系统中&#xff0c;一切都可以看成"文件"<通常包含&#xff1a;普通文件、驱动文件、网络通信文件等等>&#xff0c;系统中所有的操作都可以通过文件I/O实现&#xff0c;因此&#xff0c;掌握文件常用接口很有必要。 0.前言 屏幕前的你如果懂得main函数…

SAP S4 如何快速配置一家公司

之前配置公司采用的方法是copy的方式来配置&#xff0c;后来在做其他配置的时候发现&#xff0c;copy的方法会把很多不需要的配置也copy进来了。所就我从新定义了一个公司来进行学习研究。配置一定空的公司很简单&#xff0c;只需要三步&#xff1a; 1 定义和分配公司 • 公司…

Java中的异常、IO与NIO面试题

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

萤石网络通过注册:9个月净利2亿同比降28% 海康威视为大股东

雷递网 雷建平 12月19日杭州萤石网络股份有限公司&#xff08;简称&#xff1a;“萤石网络”&#xff09;日前通过注册&#xff0c;准备在科创板上市。萤石网络计划募资37.39亿元&#xff0c;其中&#xff0c;22亿元用于萤石智能制造重庆基地项目&#xff0c;8亿元用于新一代物…

论文投稿指南——中文核心期刊推荐(航空、航天)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

做Python网络爬虫需要掌握哪些核心技术?

在当下这个社会&#xff0c;如何有效地提取并利用信息成为一个巨大的挑战。基于这种巨大的市场需求&#xff0c;爬虫技术应运而生&#xff0c;这也是为什么现在爬虫工程师的岗位需求量日益剧增的原因。那么做Python网络爬虫需要掌握哪些核心技术呢&#xff1f;下面我们来一起看…