Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大数据计算中复杂存储过程的替代方案

大数据计算中复杂存储过程的替代方案

作者头像
Kevin Chen
修改于 2018-06-05 04:09:17
修改于 2018-06-05 04:09:17
6.6K60
代码可运行
举报
文章被收录于专栏:Kevin ChenKevin Chen
运行总次数:0
代码可运行

我们知道,存储过程的设计是为了处理具有复杂业务逻辑的计算

以往的数据结构和业务逻辑比较简单,所以单条SQL语句就可以实现业务的需要。但随着技术的进步,用户计算的复杂程度也越来越高。要实现复杂的计算,单条SQL语句就显得不是很够了。将一个复杂目标分解为几个有逻辑、清晰、可执行的步骤数据库开发人员对循环和判断语句、多层分支以及更精确的数据横向操作有了额外的需要。基于这些需要,我们引入了存储过程

存储过程是目前复杂数据计算的首选工具,在数据计算领域起着很大的作用。然而,存储过程也会造成各种不便。例如,许多函数难以调试或迁移某些数据库对存储过程的支持也不是很好。这些问题影响了数据库开发人员的效率

存储过程的不方便之处体现在逐步计算的不完善,对集合化数据计算的支持较差,不能为数据集编号,也没有对象引用机制。举个简单的例子,如果要在区域销售报表中找出“在任何州都最畅销的N个产品”,编写存储过程就显得有些复杂了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
01    create or replace package salesPkg
02    as
03             type salesCur is ref cursor;
04    end;
05    CREATE OR REPLACE PROCEDURE topPro(io_cursor OUT salesPkg.salesCur) 
06    is
07       varSql varchar2(2000);
08       tb_count integer;
09    BEGIN 
10      select count(*) into tb_count from dba_tables where table_name='TOPPROTMP';
11      if tb_count=0 then
12      strCreate:='CREATE GLOBAL TEMPORARY TABLE TOPPROTMP (
                     stateTmp NUMBER not null,
                     productTmp varchar2(10)  not null,
                     amountTmp NUMBER not null
              )
              ON COMMIT PRESERVE ROWS';
13      execute immediate strCreate;
14      end if;
15      execute immediate 'truncate table TOPPROTMP';
16      insert into TOPPROTMP(stateTmp,productTmp,amountTmp)
     select state,product,amount from stateSales a
       where not(
         (a.state,a.product) in (
           select state,product from stateSales group by state,product having count(*) > 1
         )
         and rowid not in (
           select min(rowid) from stateSales group by state,product having count(*)>1
         )
       )
     order by state,product;
17      OPEN io_cursor for
18      SELECT productTmp  FROM (
    SELECT stateTmp,productTmp,amountTmp,rankorder
    FROM (SELECT stateTmp,productTmp,amountTmp,RANK() OVER(PARTITION BY stateTmp ORDER BY amountTmp DESC) rankorder 
          FROM TOPPROTMP
         ) 
    WHERE rankorder<=10 order by stateTmp
    )
  GROUP BY productTmp 
  HAVING COUNT(*)=(SELECT COUNT(DISTINCT stateTmp ) FROM TOPPROTMP);
END;

在示例代码中,第16行是过滤重复项,并将过滤的数据写入“临时表”。因为不方便直接检索不同的数据,所以我们要先找出重复的数据,再用“not”来反转条件,这样剩下的便是不同的数据。我们用了两个子查询来实现这个函数。

第18行是要找出“在任何洲都排名前十的产品”。因为SQL没有提供交集函数,所以我们需要先用统计分析函数获取每个洲的产品排名,然后筛选出每个州前十的产品。最后,如果某个产品在每个洲都进入了前十,我们就把它存储起来。另一个方法是按产品分组,然后确认某一产品的数量是否等于州的数量;如果相等,则说明这个产品在每个州均排名前十。

除了函数不方便以外,存储过程对调试的支持相当也相当薄弱

虽然Oracle,DB2和其他数据库为其各自的存储过程提供了调试功能,但是这些功能并不完整。在执行存储过程时,无论SQL语句长短,无论包含多少层嵌套循环或计算步骤,开发者都只能查看这一整条语句的执行结果,而中间过程哪一步出错则是不可见的。这就失去了逐步调试的目的。开发者实际上只能看到光标和简单变量。虽然这些变量有用,但没有SQL的中间过程那么重要。并且启动调试工具需要大量的设置和准备工作

第三个不便之处是难以迁移。一般来说,对SQL语句进行一些简单的修改,就可以迁移了。尽管语法细节略有不同,但各厂商的SQL语句都基于ANSI标准。但是,存储过程就不一样了。因为各个厂商的标准不尽相同,差异还比较大,存储过程的迁移比重写还要复杂。在这种情况下,出于开发成本考虑,用户只好选定一个固定的数据库供应商,并且长期用下去。这样,如果数据库供应商在用户需要升级服务器、存储和授权时收费过高,那么用户也没有很大的议价空间。

任何数据库都有基本的SQL功能,但存储过程就不一定了。有的数据库提供的存储过程功能较弱,有的干脆就不提供。就拿MySQL来说,MySQL的存储过程在功能和性能上比起MS SQL、Oracle和其他大型商用数据库就显得比较弱,并且MySQL在密集并发时还可能抛出许多异常。MSSQL Compact、SQLITE、Hive、Access和还有其他一些数据库则没有提供存储过程的功能。

显然,存储过程的不便性降低了数据库的计算性能,增加了开发和维护的难度,降低了开发的效率,这些缺点还会影响到业务逻辑、计算目标以及业务决策的实现。那么,我们有没有什么办法改进这个功能呢?

esProc是专为解决复杂计算目标而设计的数据库计算脚本,提供了直观的网格界面、分步计算、专业的调试功能、灵活的语法、完整的计算系统以及对不同数据库之间交互式计算的无缝支持计算性能与存储过程相当甚至更优

esProc是一个网格界面的脚本工具。通过esProc,计算逻辑可以很方便地显示在屏幕上,业务算法也可以更容易地被解释为编程语言。esProc支持逐步计算,用户能够将复杂的目标分解为网格中的几个小步骤,然后通过这些小步骤来实现复杂的目标。根据“分步计算”的思想,esProc引入了真正实用的调试功能,包括断点、分步执行、执行至光标、开始和结束等。与SQL或存储过程(SP)的伪调试脚本不同,esProc可以直接调试基本步骤,不需要构建特定的中间表断点可以设置在任何一处,并不需要改动代码。

esProc支持集合的真实数据类型。集合中的成员可以是任何简单数据类型的数据、记录或其他集合。esProc支持有序集合,用户可以访问集合成员并执行与数据编号相关的计算,例如排名、排序、同比和环比。集合的集合可以用于表示等分组、对齐分组和枚举分组。此外,用户可以像操作对象一样操作单个记录。esProc中灵活的语法可以更容易地表示复杂的计算,例如计算多级分组中的相对位置,并通过指定的集合进行分组汇总。

esProc可以改进存储过程,从根本上提升数据库的计算能力,减少程序员的开发难度,提高开发效率,便于代码的维护和迁移,轻松实现复杂的数据算法和业务逻辑

综上,我们讨论了存储过程的不便之处,下面是esProc的解决方案。

原文:Alternative to Difficult Stored Procedures in Big Data Computation

作者:Jim King

译者:Kevin Chen

原文链接:https://dzone.com/articles/alternative-difficult-stored

评论
登录后参与评论
6 条评论
热度
最新
应该是把计算过程可视化了吧
应该是把计算过程可视化了吧
11点赞举报
应该是的。按我的理解应该是这个工具集提供了一个可视化的手段和不同数据库之间操作的“胶水”,来提高开发人员的效率,还有数据库之间的兼容性。
应该是的。按我的理解应该是这个工具集提供了一个可视化的手段和不同数据库之间操作的“胶水”,来提高开发人员的效率,还有数据库之间的兼容性。
回复回复点赞举报
这真的能被代替吗,有点玄乎
这真的能被代替吗,有点玄乎
11点赞举报
我也觉得有失偏颇,不过这是一篇译文,原文后来没有再更新了。
我也觉得有失偏颇,不过这是一篇译文,原文后来没有再更新了。
回复回复点赞举报
不够详细,就算换成了别的也还是很大的工程量
不够详细,就算换成了别的也还是很大的工程量
11点赞举报
我也感觉,不过原文如此。文章比较早了,不知道有没有后续报道。
我也感觉,不过原文如此。文章比较早了,不知道有没有后续报道。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
存储过程何去何从
它的意义自不必提,各大老牌数据库都支持,而且经常以此来挤兑一些还不支持存储过程的新数据库。反过来,它的缺点也很明显,能见到很多开发团队在努力拆除存储过程,在应用程序中实现所有的业务逻辑。 那么存储过程到底该何去何从?
朱迪
2025/05/06
940
SQL 为什么动不动就 N 百行以 K 计
SQL 中用了不少类英语的词汇和语法,这是希望非技术人员也能掌握。确实,简单的 SQL 可以当作英语阅读,即使没有程序设计经验的人也能运用。
不吃西红柿
2022/10/31
4190
SQL 为什么动不动就 N 百行以 K 计
发明 SQL 的初衷之一显然是为了降低人们实施数据查询计算的难度。SQL 中用了不少类英语的词汇和语法,这是希望非技术人员也能掌握。确实,简单的 SQL 可以当作英语阅读,即使没有程序设计经验的人也能运用。
程序猿DD
2021/12/27
5460
SQL 为什么动不动就 N 百行以 K 计
存储过程与函数
MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可
一个风轻云淡
2022/11/13
7070
存储过程与函数
1.MySQL存储过程基础(1/10)
数据库管理系统(Database Management System, DBMS)是现代信息技术中不可或缺的一部分。它提供了一种系统化的方法来创建、检索、更新和管理数据。DBMS的重要性体现在以下几个方面:
正在走向自律
2024/12/18
2390
1.MySQL存储过程基础(1/10)
SQL Server 存储过程
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 Ø 存储过程的概念     存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。     存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。     由于存储过程在创建时即在数据
hbbliyong
2018/03/05
1.9K0
MySQL的存储过程_MySQL创建存储过程
在项目开发中,经常会遇到这样一种场景,当修改A表的一条数据时,需要关联修改B表、C表甚至其他更多表的数据,为什么会这样呢?
全栈程序员站长
2022/11/08
23.6K0
MySQL的存储过程_MySQL创建存储过程
MySQL 关于存储过程那点事
存储例程是存储在数据库服务器中的一组sql语句,通过在查询中调用一个指定的名称来执行这些sql语句命令. 简介 SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程
房上的猫
2018/03/14
1.6K0
MySQL 关于存储过程那点事
MySQL高级篇-彻底掌握存储过程和函数
  MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。
用户4919348
2022/04/13
1.7K0
MySQL高级篇-彻底掌握存储过程和函数
MySQL基础-存储过程与函数
MySQL从5.0版本开始支持存储过程和函数,使得sql语句具有面向过程开发的特点
用户9645905
2023/04/01
1.2K0
MySQL基础-存储过程与函数
Mysql存储过程
存储过程就是一条或者多条SQL语句的集合,可以视为批文件。它可以定义批量插入的语句,也可以定义一个接收不同条件的SQL。
用户3467126
2019/08/29
7.2K0
3.使用条件语句编写存储过程(3/10)
在现代数据库管理系统中,存储过程扮演着至关重要的角色。它们是一组为了执行特定任务而编写的SQL语句,这些语句被保存在数据库中,可以被重复调用。存储过程不仅可以提高数据库操作的效率,还可以增强数据的安全性和一致性。此外,它们还有助于减少网络通信量,因为复杂的逻辑被封装在数据库服务器上执行,而不是在客户端。
正在走向自律
2024/12/18
2550
3.使用条件语句编写存储过程(3/10)
SQL Server 存储过程_mysql存储过程教程
**相对于视图的优势(为什么使用存储过程):** Sql Server中视图通过简单的Select查询来解决多次复杂的查询,但是视图不能提供业务逻辑的功能,而存储过程可以。 **什么是存储过程:**
全栈程序员站长
2022/11/14
5.8K0
Mysql数据库-存储过程
好了,目前我们已经大概理解了什么是 用户变量,然后我们就可以开始学习使用 用户变量 来进行 参数传递 的使用了。
Devops海洋的渔夫
2022/01/17
11.3K0
Mysql数据库-存储过程
SQLite 的挑战者
很多小微型应用程序也需要一些数据处理和计算能力,如果集成一个数据库就显得太沉重了,这种情况下 SQLite 是一个不错的选择,它架构简单,集成方便,可持久化存储数据,并提供 SQL 实现计算能力。
朱迪
2024/12/04
1270
SQLite 的挑战者
MySQL存储过程与函数精讲
MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。
小熊学Java
2023/07/16
6220
MySQL存储过程与函数精讲
MySQL(十一)视图及存储过程
PS:因为视图不包含数据,所以每次使用视图,都必须处理执行所需的任何一个检索;如果使用了多个联结和过滤创建了复杂的视图或嵌套视图,性能下降比较明显。
allsmallpig
2021/02/25
7880
8.优化存储过程的性能(8/10)
存储过程是数据库系统中预先编写好的SQL语句集合,它们被保存在数据库服务器上,可以在需要时被调用执行。存储过程的使用可以提高数据库操作的效率,减少网络通信,并且可以封装复杂的逻辑,使得数据库操作更加模块化和可重用。
正在走向自律
2024/12/18
3270
8.优化存储过程的性能(8/10)
Mysql 存储过程和存储函数的初步认知
2、而且对于存储过程和函数中SQL语句的变动,无须修改上层应用程序的代码,这也大大简化了后期对于应用程序维护的复杂度。 
跟着飞哥学编程
2022/12/02
1.6K0
SQL 嵌套 N 层太长太难写怎么办?
我们工作中写SQL处理数据是家常便饭,不管是应用内数据处理还是临时查询分析都可以用SQL完成,相对其他技术(如Java等高级语言)也更简单。不过,SQL的简单只限于简单需求,有些复杂计算场景SQL写起来却很难,嵌套N层以至于达到几百上千行,说SQL代码长度时通常不会以行计而是以KB计。这种情况并不少见,相信经常写SQL的小伙伴并不陌生。
磊哥
2023/02/01
6510
相关推荐
存储过程何去何从
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档