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

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

作者头像
Kevin Chen
修改于 2018-06-05 04:09:17
修改于 2018-06-05 04:09:17
6.6K00
代码可运行
举报
文章被收录于专栏: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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用pyinstaller打包时的图标问题
因为昨天重新研究了下python的打包方法,今天一番准备把之前写的一个pdf合并软件重新整理一下,打包出来。
efonfighting
2020/02/24
2.9K0
Pyinstaller打包exe附带图片的方法
在最近的wordpress项目中学到了图片字节码可在文件中存在,于是我做了试验并成功了(就是代码里带一堆字节码……)
全栈程序员站长
2022/07/02
2.9K0
Pyinstaller打包exe附带图片的方法
使用PyInstaller打包可执行文件
之前都是使用py2exe将Python程序打包成可执行文件,但是最近需要打包成Macos上的可执行程序。于是,选择了py2app,但是使用下来发现坑比较多,最终还是放弃了。
drunkdream
2018/12/28
2.8K0
使用PyInstaller把Python
2、解压即用(V2.1)。注意环境变量,或者用pyinstaller.py的全路径,或者到解压目录下使用。*^_^*
py3study
2020/01/09
2.5K0
python打包exe——pyinstaller遇到的那些坑及解决办法
3.心大的人,直接从别的地方把文件拷贝到另外一个地方,实际路径发生了变化,导致scripts\pyinstaller-script.py文件中引用的文件还是原先的路径
梦无矶小仔
2022/06/30
5K0
python打包exe——pyinstaller遇到的那些坑及解决办法
2个技巧,学会Pyinstaller打包的高级用法
前段时间在制作词云制作小工具的时候,直接在命令行用pyinstaller -F 工具.py指令打包成功后,启动exe可执行文件的时候各种报错。
可以叫我才哥
2021/08/05
6.8K0
python之pyinstaller打包问题系列(二)
1.最开始处OpenCV bindings requires "numpy" package.应该是opencv模块和numpy发生冲突
梦无矶小仔
2022/12/20
2.8K0
python之pyinstaller打包问题系列(二)
python图像界面改左上角窗口的的icon图标
Traceback (most recent call last): File "d:\桌面\python项目\py_boomer-master\py_boomer-master\微信公众号.py", line 20, in <module> window.iconbitmap('D:/桌面/python项目/3.png') # Corrected file path for the icon File "f:\Anaconda\lib\tkinter\__init__.py", line 1871, in wm_iconbitmap return self.tk.call('wm', 'iconbitmap', self._w, bitmap) _tkinter.TclError: bitmap "D:/桌面/python项目/3.png" not defined
命运之光
2024/04/02
3380
python图像界面改左上角窗口的的icon图标
怎么将 Python 项目打包成 exe?
用 conda 单独创建一虚拟环境,比如写一个 tkinter 应用,对了为了好看,我们可以设置以下 icon,尺寸 32x32,大图标 64x64 准备一下即可。然后用 pyinstaller 将应用打成文件包 (含 exe),最后用 Inno Setup Compiler 打成安装包,里面就是各种文件关联,图标和信息的设置了。
程序猿川子
2024/07/04
2000
怎么将 Python 项目打包成 exe?
pyinstaller打包python项目
在日常工作中,基本都是直接执行python脚本,但最近有个项目,需要提供给外部使用,而使用者又完全没有编程基础,不太可能自己安装python,安装各种依赖,所以将python项目打包为exe程序就显得尤为必要。
法号戒糖
2024/03/20
7330
原程序运行良好,Pyinstaller
昨天决定分享一下最近写的exhentai爬虫程序,参考了这篇文章,看了下里面几个常见打包软件的简介表格(可惜没nuitka) 因为是给小白用户使用,做成单个文件形式,只能在Pyinstaller和py2exe之间选择 去各自官网看了下,发现py2exe很久没更新了,对python3新版本的支持也不是太好,就决定用Pyinstaller来封装/打包 这里略过Pyinstaller的安装和使用,重点说明症状,分析过程,解决办法和教训
py3study
2020/01/03
1.1K0
py 打包exe
Python脚本不能在没有安装Python的机器上运行,如果我们想把自己的脚本分享给没有python环境的小伙伴使用,这个时候就需要将脚本打包成exe文件,即使使用方电脑没有安装python解释器,这个exe也能在上面运行。
花落花相惜
2021/12/04
1.4K0
一文学会使用 PyInstaller 将 Python 脚本打包为 .exe 可执行文件
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
Lorin 洛林
2023/12/13
5.6K0
【解决方案】Pyinstaller打包exe文件详细教程
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148629.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/04
2.5K0
猫头虎 分享:Python库 PyInstaller 的简介、安装、用法详解入门教程
今天猫头虎带您了解,如何使用 PyInstaller 将 Python 脚本打包为独立的可执行文件。最近有粉丝私信问我:“猫哥,我的 Python 程序怎么方便地打包成一个 .exe 文件,直接发给不懂 Python 的朋友用呢?”😅
猫头虎
2024/12/31
9020
别再问我Python打包成exe了!(终极版)
上次这篇文章中,评论区有好几条留言都是关心如何将python脚本打包成10多M的?
朱小五
2021/01/20
1.6K0
python打包教程
Python脚本不能在没有安装Python的机器上运行,如果我们想把自己的脚本分享给没有python环境的小伙伴使用,这个时候就需要将脚本打包成exe文件,即使使用方电脑没有安装python解释器,这个exe也能在上面运行。
花落花相惜
2021/12/06
1.1K0
Pyinstaller打包exe完整教程
pypi 镜像使用帮助https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
全栈程序员站长
2022/09/13
1.4K0
Pyinstaller打包exe完整教程
Python打包利器:auto-py-to-exe
auto-py-to-exe 是一个用于将Python程序打包成可执行文件的图形化工具。本文就是主要介绍如何使用 auto-py-to-exe 完成 python 程序打包。auto-py-to-exe 基于 pyinstaller ,相比于 pyinstaller ,它多了 GUI 界面,用起来更为简单方便
披头
2020/09/25
2.9K0
Python打包利器:auto-py-to-exe
pyinstaller打包python程序
无标题.png 说明 文档对应内容为 pyinstaller 4.2, 支持 python 3.5+ 如果需要使用python2.7,则需要使用 pyinstaller <= 3.6 安装 从PyPI安装 pip install pyinstaller 升级 pip install --upgrade pyinstaller ---- 使用命令行方式 语法: pyinstaller [选项] 脚本 [脚本...] # 使用命令行方式 常用选项: 生成选项 -D # 生成单个可执行程序 -F #
CODER_D_XF
2021/01/21
1.6K0
pyinstaller打包python程序
推荐阅读
相关推荐
用pyinstaller打包时的图标问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验